2009-08-01 3 views
16

C# 3.0에 자동 구현 된 속성 언어 기능이있는 이유를 이해하지 못했습니다. 그들은 결과 IL 코드 (기계 언어)에서 다르게 구현되기 때문에 C# 3.0의 자동 속성과 공용 필드의 차이점

그것이 만드는 차이는 당신이

public string FirstName { get; set; } 
+0

아무도 코드 이름을 사용하지 않습니다. –

+0

[C# 3.0 +의 속성과 필드의 차이점] 중복 가능 (http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal

+0

모두 여기서의 대답은 이것이 언어 디자인의 결함이라는 사실을 지적하는 것 같습니다. 확실히 여기에있는 문제는 컴파일러 또는 런타임 수준에서 해결할 수 있습니다. 바이너리와 소스 호환성을 깨뜨리는 이유는 무엇입니까? 왜 우리는 멀리 최적화 될 수있는 보일러 플레이트를 추가해야합니까? –

답변

21

보다

public string FirstName; 

을 말할 때 무엇. 자동 속성은 공개 getter 및 setter로 공개되지만 공용 필드는 단일 필드 일뿐입니다.

따라서 자동 속성을 구현하면 나중에 일부 속성의 내부 동작을 변경할 수 있습니다. 다시 컴파일하지 않고 getter 또는 setter (유효성 검사기를 추가하는 등)를 사용하는 종속 클래스를 다시 코딩하지 않아도됩니다.

+9

또한 데이터 바인딩을 위해 속성을 사용할 수 있습니다. –

0

첫 번째 필드는 공용 필드이고 두 번째 필드는 공용 속성입니다.

주요 차이점은 사용 방법에 있습니다. 예를 들어 WPF는 속성이 아닌 데이터에만 바인딩 할 수 있습니다.

2

다른 점은 속성을 읽는 코드로 컴파일 된 다른 어셈블리가 속성에 대해 컴파일된다는 것입니다.

나중에 getter 또는 setter에 코드를 추가해야한다고 결정한 경우 해당 코드에 연결된 다른 모든 어셈블리를 강제로 다시 컴파일하지 않고도 코드를 추가 할 수 있습니다.

필드에는 없습니다. 나중에 필드를 속성으로 변경하면 해당 코드를 추가하기 위해 연결된 다른 어셈블리가 속성이 아닌 필드를 읽도록 컴파일되므로 제대로 작동하지 않습니다.

또한 데이터 바인딩과 비슷한 필드가 아닌 속성을 찾기 위해 많은 코드가 작성되었습니다.

5

나중에 사용자 지정 구현이있는 속성으로 각 속성을 변경하려는 경우 어떻게되는지 생각해보십시오. 자동으로 구현되는 속성 인 경우 필드를 추가하고 구현을 변경하기 만하면됩니다. 완전한 소스 및 바이너리 호환성.

필드가 시작되는 경우 소스 이나 바이너리 호환성을 얻을 수 없습니다. 그것을 참조하는 모든 것을 다시 빌드하고 더 이상 컴파일하지 않는 모든 것을 고쳐야합니다.

또한 properties have various benefits over fields입니다. 필자가 개인적으로 이의를 제기하는 주요 이유는 API에서 구현 구현을 노출하기 때문입니다.

9

공개 입력란을 선언하면 다른 사람들이 말한 내용을 추가하기 만하면 해당 입력란은 읽고 쓸 수 있습니다. public 자동 속성 선언은 속성이 public이지만 수정자를 추가하여 get/set 수준에서 액세스 가능성을 제어 할 수 있습니다.

클래스의 사용자는 FirstName을 공용 속성으로 간주합니다. 그러나, 그/그녀는 그것에 쓸 수 없습니다.이 때문에 사용

2

: OO에 의해 '정결은'

0

자동차 등록 규칙 것을
public string FirstName { get; private set; }
쉬운 속성은 그들이 어떤 일반 부동산과 같은 백업 필드를 사용하여, 컴파일러 일반 속성을 생성하지만 당신은하지 않습니다 그 코드를 작성해야합니다. 여기에 컴파일러에 의해 생성 된 코드의 매우 설명 샘플 (Reflector 덕분에)입니다 : 제품이 RTM을 진행하면 마이크로 소프트의 외부

[CompilerGenerated] 
private string <ContentType>k__BackingField; 

public string ContentType 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<ContentType>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<ContentType>k__BackingField = value; 
    } 
} 
관련 문제