바인딩 일반적으로은 필드에서 작동하지 않습니다. 대부분의 바인딩은 부분적으로 ComponentModel PropertyDescriptor
모델에 기반하며, 기본적으로 속성에서 작동합니다. 이렇게하면 알림, 유효성 검사 등을 사용할 수 있습니다 (어떤 것도 필드에서 작동하지 않습니다).
내가 들어갈 수있는 것보다 많은 이유 때문에 공개 입력란은 나쁜 생각입니다. 그들은 속성, 사실이어야합니다. 마찬가지로, 변경 가능한 구조체는 매우 나쁜 아이디어입니다. 적어도 예상치 못한 데이터 손실 (일반적으로 변경 가능한 구조체와 관련됨)으로부터 보호합니다. 이 클래스는 다음과 같아야합니다.
[DataContract]
public class StatusInfo
{
[DataMember] public int Total {get;set;}
[DataMember] public string Authority {get;set;}
}
이제는 생각했던대로 동작합니다. 당신이이 불변 구조체 싶은 경우에, 그 확인 될 것이다 (그러나 데이터 바인딩은 물론, 단 하나의 방법이 될 것이다) 그러나
[DataContract]
public struct StatusInfo
{
[DataMember] public int Total {get;private set;}
[DataMember] public string Authority {get;private set;}
public StatusInfo(int total, string authority) : this() {
Total = total;
Authority = authority;
}
}
, 나는이 구조체는 왜 첫 번째 질문 것 처음에는 매우 희귀하다 .NET 언어로 구조체를 작성합니다. WCF "mex"프록시 계층은 어쨌든 (어셈블리 공유를 사용하지 않는 한)이를 소비자의 클래스로 만듭니다. 은 "왜 사용 구조체"응답 ("알 수없는 (구글)")에 대한 답변에서
:
이 내 질문에 대한 응답 인 경우, 그것은 여러 가지 방법으로 잘못된 것입니다. 첫째, 값 유형 은 변수로이 일반적으로 스택에 할당됩니다. 그것들이 힙 (예를 들어 배열 /리스트)에 푸시된다면 클래스와 오버 헤드의 차이는 크지 않습니다. 객체 헤더와 참조의 작은 비트입니다. 구조체는 항상 작은이어야합니다. 여러 필드가있는 경우 크기가 너무 커져서 스택을 죽이거나 블리 팅으로 인해 속도가 느려질 수 있습니다. 또한 구조체는 변경 불가능해야합니다. 이 무엇인지 알지 않는 한.
개체를 나타내는 거의 모든 것이 움직일 수 있어야합니다.
데이터베이스를 공격하는 경우 구조 대 클래스의 속도는 프로세스 외의 작업이나 네트워크를 통한 작업과 비교할 때 문제가되지 않습니다.조금 느린 경우에도 개체를 개체로 취급하는 것과 비교할 때 아무런 의미가 없습니다. 일부 측정 항목
위에 1M 개체 :
struct/field: 50ms
class/property: 229ms
다음 (속성 VS 속도 차가 오브젝트에 할당하지 필드)에 기초하여. 따라서 약 5 배 느리지 만 여전히
매우 빠름. 이것이 병목 현상이 아니기 때문에 조기에 최적화하지 마십시오!
using System;
using System.Collections.Generic;
using System.Diagnostics;
struct MyStruct
{
public int Id;
public string Name;
public DateTime DateOfBirth;
public string Comment;
}
class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public string Comment { get; set; }
}
static class Program
{
static void Main()
{
DateTime dob = DateTime.Today;
const int SIZE = 1000000;
Stopwatch watch = Stopwatch.StartNew();
List<MyStruct> s = new List<MyStruct>(SIZE);
for (int i = 0; i < SIZE; i++)
{
s.Add(new MyStruct { Comment = "abc", DateOfBirth = dob,
Id = 123, Name = "def" });
}
watch.Stop();
Console.WriteLine("struct/field: "
+ watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
List<MyClass> c = new List<MyClass>(SIZE);
for (int i = 0; i < SIZE; i++)
{
c.Add(new MyClass { Comment = "abc", DateOfBirth = dob,
Id = 123, Name = "def" });
}
watch.Stop();
Console.WriteLine("class/property: "
+ watch.ElapsedMilliseconds + "ms");
Console.ReadLine();
}
}
C++ 프로그래머로서 나는 위에 열거 한 의견을 매우 어렵게 느낍니다. 나는 또한 다른 결론에 도달하는 것 같다. 예를 들어 "5 배 느리지 만 매우 빠르고 매우 빠릅니다"라고 말하면됩니다. 반면에 "구조체 사용은 약 5 배 빠르지 만 여전히 매우 느립니다." –
@ 대니얼 한숨, 여기에 우리가 다시 간다. "C++은 모든 것보다 더 빠르며 항상 사용되어야한다"(한숨). 다양한 애플리케이션에서 눈에 띄는 차이는 없습니다. –
나는 C++이 더 빠르다고 말한 적이 없다! 그런 결론은 당신이 진지한 선입견 (또는 오해 일 수도 있음)을 가지고 있음을 나타냅니다. C++은 더 빠르지 만 중요하지는 않습니다. "C++은 더 쉽게 접근 할 수있게 해줍니다. 이것은 중요합니다. 아니면 내 주장을 뒷받침하기 위해 당신이 말한 것을 오해했을 수도 있습니다. –