2009-11-07 2 views
4

C# : "{get; set;}"을 제거 할 수 있습니까?

사이에 차이가 있습니까?

public T RequestedValue { get; set; } 

public T RequestedValue; 

?

이 코드에서 가져온 것 :

public class PropertyChangeRequestEventArgs<T>:EventArgs 
{ 
    public PropertyChangeRequestEventArgs(T pRequestedValue) 
    { 
     RequestedValue = pRequestedValue; 
    } 

    public T RequestedValue { get; set; } 
} 
+0

가능한 복제본 [C#의 필드와 속성의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and- a-property-in-c) – nawfal

답변

23

첫 번째는 FieldAuto-Implemented Property이다. 정기 Properties는 게터와 세터를 표시 할 수 있습니다 만, 실제로 값을 저장하기 위해 개인 필드가 :

private int someProperty; 
public int SomeProperty 
{ 
    get { return someProperty; } 
    set { someProperty = value; } 
} 

첫 번째는 응용 프로그램에서 다른 모든 코드에 영향을주지 않고 클래스의 구현의 특정 측면을 변경할 수 있습니다. 가장 중요한 점은 속성을 사용하면 바이너리 호환성을 손상시키지 않고 변경이 가능하다는 것입니다 (필드는 종종 코드를 위반하지 않고 속성으로 변경할 수 있음). 공개 회원 인 경우 재산을 권유합니다. 속성 페이지에서

(Snarfblam의 코멘트에서 뻔뻔하게 도둑질) :

속성은 읽기, 쓰기, 또는 개인 필드의 값을 계산하는 유연한 메커니즘을 제공 구성원입니다. 속성은 공용 데이터 멤버 인 것처럼 사용할 수 있지만 실제로는 접근 자라고하는 특수 메서드입니다. 이를 통해 데이터에 쉽게 액세스 할 수 있으며 여전히 방법의 안전성과 유연성을 향상시키는 데 도움이됩니다. 그들이 모델 - 뷰 - 뷰 모델 구현의 UI를 업데이트하는 INotifyPropertyChanged 이벤트 같은 것들을 쉽게 구현을 허용하는 배킹 필드

속성은 가장 유연한 형태입니다.

+7

가장 중요한 점은 속성을 사용하면 바이너리 호환성을 손상시키지 않고 변경이 가능하다는 것입니다 (필드는 종종 코드를 위반하지 않고 속성으로 변경할 수 있음). 공개 회원 인 경우 속성을 사용하는 것이 좋습니다. – snarf

+0

@Snarfblam - 그건 내가 말하려고하는 것입니다. 내가 도둑질해도 괜찮습니까? – ChrisF

+0

@Snarfblam, 당신은 종종 코드를 위반하지 않고 그것을 바꿀 수 있지만, 당신이 그것에 의존하는 기존의 실행 파일과 라이브러리를 깰 수 있습니다. 재 컴파일이 필요합니다. – Dykam

1

당신은 쓸 수 있습니다 :

public T RequestedValue { get; set; } 

을의 바로 가기로 :

private T _requestedValue; 

public T RequestedValue 
{ 
    get { return this._requestedValue; } 
    set { this._requestedValue = value; } 
} 

또한 성능을 고려, 완전히 동일합니다.

+0

괜찮 으면 마크 업을 고정합니다. – Dykam

+0

질문에 답하지 않고있다 – Letterman

+0

첫 번째 질문 (ChrisF)이 그 차이에 충분히 대답하기 때문에 질문에 대답하지 않는다는 것을 알고 있습니다. 나는 단지 속성의 간결한 구문에 대한 precisation을 추가 싶었어요. – venezia

0

대답은 그렇습니다. {get; 세트; }하지만 일부는 미묘한 차이가 있습니다. 일부 사람들은 필드와 속성이 근본적으로 다른 디자인 의도를 표현한다고 말하지만 실제로 이러한 차이는 C#이 진화하고 점진적으로 구문상의 차이가 흐려짐에 따라 오래 동안 침식되어 왔습니다.

필드 및 속성 간의 컴파일러 - 이진 수준 차이의 좋은 목록은 SO 질문 difference-between-property-and-field-in-c을 참조하십시오. 그러나 그 질문에 대한 대답은 인터페이스를 선언 할 때 속성의 특별한 역할에 대한 중요한 포인트를 놓쳤습니다.

3

깊은 설명!

{get; set;}은 자동 속성이고 두 번째 필드는 필드입니다.

필드는 데이터를 포함하는 일부 유형의 일반 변수입니다.

속성은 두 가지 방법 (때로는 단지 하나임), 하나는 get, 하나는 설정입니다. 그들은 단지 필드와 같은 문법을 가지고 있지만 실제로는 아주 다릅니다.

특성

자동 특성, 또한, 내부적으로 개인 필드를 만들 가져 오기에 그 값을 돌려 줄 등 값의 집합을 필터링하거나 취득으로 뭔가를 가상화를위한 보통, 그 설정 값.

겉으로보기에 이것은 일반적인 필드와 같지만 속성을 사용하는 장면 (IL)은 필드를 사용하는 것과 완전히 다릅니다.

x = a.Get_Property1(); 

왜 그것이 좋은 것입니다 :

x = a.Property1; 

이런 일에 번역입니다 :

a.Set_Propert1(4); 

이 :

a.Property1 = 4; 

같은 무언가로 번역입니다 공공 재산만을 사용하는 연습, ev 자동이라면 요? 이 속성을 사용하는 경우 ..

, 즉 다른 응용 프로그램에서 사용하면 라이브러리를 작성하는 말, 언젠가 당신은 당신의 클래스의 필드 중 하나를 제약하는 라이브러리의 새 버전을 출시 할 당신은 단지 속성을 변경할 수 있습니다 (자동적 인 것 일지라도 그것을 완전하게 대체 할 수 있습니다). 그리고 라이브러리를 사용하는 모든 응용 프로그램은 같은 방식으로 계속 사용할 수 있습니다.

공개 입력란을 만들었지 만 지금 제약하고 싶은 경우이 속성을 만들어 필드를 비공개로 설정해야하지만 그렇게하면 라이브러리를 사용하는 모든 응용 프로그램이 더 이상 필요하지 않게됩니다. 필드와 속성을 사용하는 방식이 다르기 때문에 베일을 벗긴다.

관련 문제