2012-03-10 5 views
11

자동 속성을 사용할 때 컴파일러는 화면 뒤에 자체 백업 필드를 생성한다는 것을 알고 있습니다. 그러나, 많은 프로그램에서 나는 명시 적으로 아래역전지가 있거나없는 자동 속성 - 환경 설정?

private int _backingField; 

public int Property { get { return _backingField; } } 

의 차이는 위의 무엇이며, 쓰기, 나는 사람들을 볼 배울 읽어?

public int Property { get; private set; } 

나는 당신이 실제로는 getter 또는 세터의 부작용이있을 때 명백한이 속성을 사용하는 것을 이해하지만 종종 그렇지 않다. 또한 구조체의 경우에는 명시 적으로 배킹 필드를 사용해야한다는 것을 알고 있으므로 속성을 통해 멤버에 액세스 할 수 없습니다.

내가 발견 할 수 있었던 유일한 차이점은 값을 호출하는 방법이 정의 된 클래스 내에서 다름이라는 점입니다. 간단한 기본 설정인가, 아니면 속성을 통해 값을 호출하는 것이 더 많은지 또는 직접 필드에 액세스하여? 간단한 규칙은 무엇입니까?

답변

14

두 가지 미리보기 간에는 큰 차이가 없습니다. 예를 들어 참조로 속성을 전달할 수는 없지만 거의 문제가되지 않습니다. 당신이 원하는 경우, 필드는 다음과 같이 읽기 전용 될 수 있습니다 :

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

차이가있다. 위에서 작성한 코드는 값이 클래스 내의 다른 위치에서 변경되는 것을 방지하여 실제로 변경할 수없는 것이 분명하다는 것을 분명히합니다. 읽기 전용 필드를 생성자 내에서만 설정할 수있는 읽기 전용 필드를 자동으로 구현하는 속성을 선언 할 수 있기를 정말로 바라고 있습니다. 그러나 현재로서는 사용할 수 없습니다.

이 그런데, 오히려 혼란 : 또한

, 난 당신이 명시 적으로, 당신은 속성을 통해 그 구성원에 액세스 할 수 없습니다 구조체의 경우에 백업 필드를 사용한다는 것을 알고 있습니다.

무엇을 의미합니까? 구조체 내에서 속성을 확실히 사용할 수 있습니다. 당신은 변경할 수 구조체입니다 필드를 백업에 대해 얘기하는 즉 차이 :

foo.someField.X = 10; 

foo.SomeProperty.X = 10; 

? 그렇다면 일반적으로 내 구조체를 처음부터 불변으로 만들면 문제가되는 것을 피할 수 있습니다.

+1

예를 들어 XNA의 Vector2를 사용하면 내가 말하면 public Vector2 TheVector {get; 세트; } 전화 할 수 없습니다. TheVector.X = 10; 대신 실제 필드를 사용해야합니다. 값/참조로 전달하는 것에 관한 것. (C#의 값/참조로 전달하는 것을 설명하는 읽기 자료가 있습니까?) – Taelia

+0

또한 두 예제가 실제로 차이가 없다면 왜 그렇게 많은 사람들이 실제적으로 백킹 필드를 명시 적으로 생성합니까? 목적)? – Taelia

+0

@Taelia : 맞습니다. 일반적으로 피해야하는 가변 구조체의 경우입니다. 이 속성은 값의 복사본을 반환하기 때문입니다. 그리고 나는 다른 사람들이하는 일에 대한 이유를 밝히려하지 않을 것입니다. –