2009-12-24 3 views
6

내가이 .NET 2.0 생각, 마이크로 소프트는공공 접근 .NET

public string Name { get; set; }

처럼 뭔가 생략하지만 위의 코드 사이의 실제 차이가 된 접근을 도입, 단순히 :

public string Name; 
+1

다음 내용을 읽어 보시기 바랍니다. http://stackoverflow.com/questions/1019571/why-do-we-use-net-properties-instead-of-plain-old-get-set-functions –

+1

http : //stackoverflow.com/questions/1272521/propertywith-no-extra-processing-vs-public-field – Groo

+1

정확히 ac가 될 # 3.0 기능 (.NET 3.5)입니다. –

답변

6

가장 큰 차이점은 나중에 이미 당신에 대해 컴파일 된 당신의 수완 또는 세터, 그리고 다른 DLL로 로직을 추가해야하는 경우, 당신은 쉽게

public string Name { get{/*special code*/} set{/*special code*/} } 

public string Name { get; set; } 

을 변경할 수 있다는 것입니다

이고 새 DLL을 게시하고 다른 DLL을 다시 컴파일하지 않아도됩니다.


당신이

public string Name { get{/*special code*/} set{/*special code*/} } 

public string Name; 

를 변경 한 경우 그들은으로 필드를 액세스 변경 때문에 당신은 확실히 당신을 사용하는 모든 DLL을, 재 컴파일을해야합니다 반면 재산에 접근.

오픈 소스 프로젝트 또는 구성 요소 공급 업체 등 다른 프로그래머에게 DLL을 제공 할 때 더 큰 문제가되는 것은 분명합니다. 자영업자 용 앱을 제작하는 것보다

+0

흥미로운 이유는 두 번째 경우 컴파일 된 코드가 다른 이유입니다. 모든 클라이언트가 필드가 속성으로 대체되는 즉시 다시 작성해야하므로 필드 컴파일의 의도는 무엇입니까? –

+0

MSIL에서 속성 액세스는 특별한 종류의 메서드 호출이기 때문에 필드 액세스는 필드 액세스에 불과합니다. –

+2

차이점의 예로 : 필드를 "out"또는 "ref"매개 변수로 사용할 수 있지만 속성을 사용하여이를 수행 할 수는 없습니다. 그런 식으로 필드를 사용하는 코드는 속성으로 변경하면 중단됩니다. –

4

차이점은 FieldProperty 사이이다. 필드는 클래스 인스턴스의 멤버 변수입니다. 대조적으로, 속성은 두 개의 별도의 행동에 대한 속기입니다 - get 및 set : 속성이 단순히 게터에 반환하고 설정하여 개인 필드를 "래핑"로이 과도하게 단순화 된 예입니다

public string Name 
{ 
    get 
    { 
     return _name; 
    } 
    set 
    { 
     _name = value; 
    } 
} 

private string _name; 

세터에서. 그러나 속성은 기본 값의 "게이트웨이"가 될 때 매우 유용합니다.

set 
{ 
    this.InvokePropertyChangedEvent(); 
    _name = value; 
} 

당신에 대해 질문하고 정확한 구문 : 프로그램의 흐름이 뭔가 필드의 값이 설정 될 때마다 (예를 들어, 이벤트가 해고) 일이 필요로하는 경우, 그것은 재산의 세터에서 발사 할 수있다 Auto-Implemented Properties이라고하며 위의 간단한 예제를 간단히 보여줍니다. 컴파일러는 속성에서 가져 와서 설정 한 개인 멤버를 만듭니다.

+1

@ 렉스 : 그러나 그 질문에 무엇이 요구되었는지는 아닙니다. 문제는 필드와 속성의 차이가 아니라 선언의 차이에 관한 것입니다. –

+0

@curious 두 선언의 차이점에 대한 전체 설명에는 OP가 이미 가지고 있다고 생각할 수없는 배경 정보가 필요합니다. 당신이 찾고있는 짧은 비트는 끝입니다. –

+0

나는 내 대답에 사건을 제기하는 것에 대해 글쓰기를 원했지만 그 질문은 다시는 아니다. –

4

자동 속성은 C# 3.0에서 처음 소개되었습니다. 차이 :

public string Name { get; set; } 

public string Name; 

는 제가 property 제 동안 field 선언이다. OOP 속성은 필드를 캡슐화하는 데 사용됩니다. 속성은 setter 또는 getter 또는 둘 다를 가질 수 있으며 각각에 대해 다른 액세스 가능성 수준을 지정할 수도 있습니다.

1

예, 두 번째 줄에있는 코드는 메모리에서 직접 멤버에게 제공되지만 첫 번째 줄에서는 장래에 논리를 추가하여 유효성을 검사하고 지연 할당을 할 수있는 간접 지정 기능이 있습니다.

또한 리플렉션을 사용하는 경우 첫 번째 예제에서는 Property Setter와 Getter를 찾아야하고 두 번째 경우에는 멤버 변수를 직접 검색해야합니다.

일반적으로 속성을 사용하면 훨씬 더 좋은 디자인입니다.

2

속기 속성 선언의 차이점은 이렇게 정의 할 수 있다는 것입니다.

public string Name { get; private set; } 

이것은 속성을 공개적으로 읽을 수 있지만 비공개 멤버 만 쓸 수 있음을 의미합니다. 당신은 한 분야에서 그런 일을 할 수 없습니다. 당신이 짧은 손 속성 선언의 생성 된 IL 보면

, 당신 컴파일러에서 읽거나에 기입하는 속성에 /자동 생성 된 멤버 필드를 추가 한 것을 발견 할 것이다.

+0

액세스 수정 자 추가 기능이 있습니다. getter와 setter에서 서로 다른 액세스를 여러 번 사용했지만 속기 선언에서는 사용하지 않았습니다. 이 질문에 대해서도 궁금해했지만 물어볼 수는 없었습니다. 이제는 더 명확 해졌습니다. 다른 차이점이 있다면 나는 감탄하지 않을 것이다. –

2

가치를 얻거나 저장하기 위해 코드를 작성하는 것과 기능적 차이는 없습니다. 그러나 호출자가 필드 나 속성을 기대할 수 있고 리플렉션을 사용하여 하나 또는 둘 다를 수락하는 경우가 있습니다. 예를 들어 WPF는 속성이 아닌 필드에만 바인딩 할 수 있습니다.

0

propertygrid 사용자의 유용한 차이점 중 하나는 다음과 같습니다. public string Name {get; 세트; } 우리는 Propertygrid에서 소스 데이터를 쉽게 설정할 수 있습니다.

선언하는 동안 public string Name; 은 Propertygrid에 대해 전체적으로 사용되지 않습니다.

관련 문제