2012-12-28 3 views
0

가능한 중복 :
What is the difference between a field and a property in C#?멤버 변수 또는 getter/setter 속성을 사용해야합니까?

나는 정기적으로 내 수업/하위 계층 보호 변수를 생성 할 필요가있다. 그러나 변수 대신 간단한 get/set 속성을 사용하는 구현을 계속 볼 수 있습니다.

getter 또는 setter에서 실행해야하는 코드가 없으며 범위가 항상 보호되므로 차이가 있습니까?

protected int foo1; 
// vs 
protected int foo2{ get; set; } 

나는 전자의 장점은 직접 값으로 초기화 할 수 있습니다 알고 있지만, 내가 알고 있어야합니다 다른 것들/제한이 있는지 궁금하네요.

주 : getter/setter에 코드가있는 경우가 이 아닙니다.이 아닐 수 있습니다. 이것들은 단순히 내부적으로 계산 된 메트릭의 자리 표시 자이며 성능은 매우 중요합니다 (심지어 밀리 초 수준까지). 처음에는 getter/setter를 완전히 무시하므로 성능이 더 좋습니다.

+0

속도가 문제입니까? 시험 했니? – Paparazzi

+0

유일한 질문은 아닙니다. 단순함. 다시 한 번, 멤버 변수를 인라인으로 초기화 할 수 있지만 생성자를 사용하여 자동 생성 된 배킹 필드가있는 소품을 초기화하거나 배킹 필드를 직접 구현해야합니다.이 경우 속성이 필요하지 않습니다. 어느 쪽이든, 방금 보호 된 비공개에 대한 멤버 변수와 공용 또는 혼합 액세서 범위 값에 대한 속성을 사용했습니다. – MarqueIV

답변

4

차이점은 나중에 getter/setter 메서드에 논리를 추가해야하는 경우 호출 코드가 중단되지 않는다는 것입니다.

+2

잘 저스틴, 그리고 솔직히, 당신이 그것을 유지 해야하는 사람이있을 때 이것은 생명의 은인이 될 수있다. –

+0

이것은 SOLID- 수정을 위해 닫히고 확장을 위해 열립니다. – TomTom

+0

분명히이 경우 필드를 속성으로 다시 구현할 수 있습니다. (어쩌면 반사 기반 물건 ..) –

0

읽기 전용 인 경우가 아니면 보호 된 멤버에게 getter 및 setter를 사용합니다.이 경우 protected readonly은 정상적으로 작동합니다. 모든 정직한면에서 누군가가 리플렉션을 사용하여 속성을 반복하지 않는 한 실제로는 중요하지 않습니다. 항상 다른 속성으로 전환 할 수 있으며 올바르게 컴파일됩니다.

실제로 생각해 보니, 보통 상속 받기를 원하는 것은 명시적인 기본 상태가 아니기 때문에 일반적으로 메서드를 사용합니다.

보호 된 속성이 많으면 솔직하게 캡슐화가 깨지기 때문에 코드 냄새가납니다.