2014-12-20 4 views
8

필자는 장래에 필요할 때 추가 로직을 제공 할 수있는 것처럼 필드에 대해 속성을 사용하는 이점에 대해 알고 있습니다.C#에서 데이터 바인딩을 위해 공용 필드를 사용할 수없는 이유는 무엇입니까?

하지만 실제로 데이터 바인딩이나 JavaScriptSerializer 클래스와 같은 JSON 시리얼 라이저에도 공용 필드를 사용할 수없는 이유가 궁금합니다.

이러한 경우 공개 입력란을 무시할만한 이유가 있습니까? 아니면 어떤 종류의 국제 대회입니까? 아니면 사용자가 속성을 사용하도록 강제 할 수 있습니까?

답변

6

짧은 버전은 public (또는 실제로는 심지어 protected) 필드 대신 항상 속성을 사용하는 것이 처음부터 .NET의 근본적인 디자인 선택이었습니다.

약간 긴 버전은 public 필드에 대한 지원을 추가하면 데이터 바인딩 프레임 워크 (어느 것이 든 참조하는 것)에 복잡성이 추가된다는 것입니다. 또한 필드에는 변경 알림에 대한 지원이 없으며 적어도 Winforms 개발과 같은 상태 저장 환경에서는 데이터 바인딩의 중요한 측면입니다. 값을 검색하고 설정하는 수준에서도 필드와 속성이 다릅니다. VB.NET 또는 C#의 구문 값은 속성의 값을 검색하거나 설정하는 것이 필드의 속성과 동일하기 때문에 데이터 바인딩과 같은 프로그래밍 방식 시나리오에서이를 수행하는 데 사용되는 메커니즘은 속성과 속성이 다릅니다. 전지.

결국이 모든 것은 공용 필드에 대한 지원을 모든 데이터 바인딩 시나리오에 추가하는 데 더 많은 작업이 필요하다는 것을 의미하므로 아무튼이 패턴은 반 패턴이므로이 작업은 수행되지 않습니다.

3

이 제한의 기술적 이유는 없습니다. 공개 필드를 속성 목록에 추가하고 바인딩을 허용 할 수 있습니다. 사실 .NET에 속성이나 공개 필드를 자동으로 선택하는 API가 있습니다 (이름만으로도 가능). 예를 들어 LINQ의 ExpressionPropertyOrField 메서드를 사용하여 첫 번째 매개 변수의 식에서 반환 된 형식을 기준으로 둘 중 하나를 선택합니다.

그러나 필드를 공개 상태로두면 잠재적 인 문제의 배열에 노출 될 수 있으므로 시스템 디자이너는 공개에 의존하여 시스템 디자인에서 공개 필드의 사용을 보류하여 공용 필드의 사용을 방해하려고 시도합니다.

또한 바인딩을위한 이벤트에 의존하는 시스템에서 공개 필드 설정시 이벤트를 실행할 수 없기 때문에 기술적 인 이유로 필드를 사용할 수 없습니다.

+0

Winforms 또는 MVVM 데이터 바인딩과 같은 것에 기술적 인 제한이있는 것은 UI를 업데이트하기 위해 값이 변경 될 때 모두 이벤트 발생에 의존하기 때문입니다. 필드에서는 이러한 알림을 사용할 수 없습니다. –

0

인터페이스에서 필드를 선언 할 수 없으므로 공용 필드를 사용하지 않아야합니다. 모든 입력란은 비공개 전용이어야합니다.

코드가 추상화에 따라 다르면 인터페이스를 사용해야하며 여기에서는 공용 필드를 사용할 수 없습니다.

+0

두 가지 모두 좋은 점이지만, 이러한 이유는 데이터 바인딩 시나리오에서 필드 지원이없는 이유가 아니라 속성을 사용하는 것이 기본 디자인 선택 이유 인 이유에 대해 설명합니다. –