2012-10-31 3 views
1

내가 알 수있는 바로는 속성은 접근 자 방식의 복잡한 기능을 제공하는 데 사용됩니다. 그러나 이들은 정상적인 메소드 상속 행위의 대가로 그렇게합니다. 기존의 setter/getter 메서드에 비해 속성을 사용하면 어떤 이점이 있습니까? 속성 및 접근 자 메서드의 장단점은 무엇입니까?C# - 접근 자 메서드 대 속성?

+6

첫 번째 예는 제대로 컴파일되고 실행됩니다. – dtb

+0

당신은 여전히 ​​그 멤버들을 상속하고 있습니다. 파생 클래스에서 당신이 Datum의 기본 클래스 구현에 접근하기를 원할 필요가있는'Datum' 프로퍼티를 쿼리하도록 지정할 때 ('base.Datum = 2 ') - 관계없이 작동해야한다고 확신 할지라도 (Datum을 재정의하고 여전히 기본 구현을 쿼리 할 때 수퍼 클래스 접근자를 사용해야 함) – Charleh

+0

흠, 어떤 이유로 하나의 프로젝트에서 오류가 발생하지만 새 프로젝트에 넣는 것이 좋습니다. 내 실수. – weberc2

답변

1

혼란 스러울 수도 있습니다. 예제에서 위의 메소드에 액세스 할 수 있어야합니다. 예를 들어이 유형 집합이 주어지면 다음이 작동해야합니다.

public class Base 
{ 
    public virtual int Datum { get; set; } 
} 

public class Derived : Base 
{ 
    public override int Datum 
    { 
     get { return 12; } 
     // set method remains as normal, with just the get overriden 
    } 

    public void SetDatumMethod(int newValue) 
    { 
     Datum = newValue; // Datum as a property is still accessible 
    } 
} 

파생 클래스는 여전히 속성을 상속합니다. 컴파일러가 set_Datum(int x)get_Datum() 메서드를 생성하기 때문에 실제로 속성은 C#의 구문 론적 설탕입니다 (주로). 위와 같이 개별적으로 속성 get/set 메서드를 재정의 할 수 있습니다.

속성을 사용하는 이점은 추가 의미 론적 의미가 있다는 것입니다. 그들은 데이터를 생성하는 방법이 아닌 어떤 방식으로 데이터를 "포함"하거나 "표현"합니다.

+0

Gotcha. 참고, 당신이 내 예를 옳다면, 나는 그것을 무효로 제거했습니다. 또한 속성의 "숨김"(정확히 이해하지는 않지만 속성과 마찬가지로 접근 자 메서드를 숨길 수 있다고 생각하지 않습니다)? 어떤 손을 기억할 수는 없지만 접근 자 메서드로 속성을 처리하려고 할 때 다른 어려움이 있음을 기억합니다. 지금까지 귀하의 대답은 도움이되었지만 더 많은 정보가 있으면 더 많은 정보를 제공해 주시면 감사하겠습니다. – weberc2

+0

고맙습니다. 저는 귀하의 대답이 일반화가 아닌 두 가지를 철저히 비교했는지 확인하기를 원했습니다. – weberc2

0

Visual Studio 디버거는 개체를 볼 때 getter 메서드를 실행합니다. 즉, 속성 접근자는 예측할 수없는 시간에 실행되므로 식별 할 수있는 부작용이 발생하지 않아야합니다. 속성을 남용하면 해결하기 어려운 버그가 발생할 수 있습니다.

메서드를 사용하는 또 다른 이유는 순서 검색이 매개 변수화 될 가능성이 높기 때문입니다.

속성 접근이 계산적으로 저렴하다는 것이 좋습니다. 클라이언트 코드는 프로퍼티 값을 로컬 변수에 두지 않아야합니다. 즉, 조숙 한 최적화입니다.

+0

"악용하는 재산"을 어떻게 의미합니까? 악용과 잠재적 결과로 생기는 버그에 대해 더 구체적으로 설명 할 수 있습니까? 또한 "주문 검색"이란 무엇이며 "주문 검색"속성이 사용하는 모든 종류의 것보다 "매개 변수화 된 주문 검색"이 더 나은 이유에 대해 더 구체적으로 설명 할 수 있습니까? 마지막으로, 재산에 대한 접근을 "계산적으로 저렴하게"하는 것이 무엇을 의미하는지 이해하지 못합니다. 어떤 상황에서 클라이언트 코드가 속성 값을 로컬 변수에 배치해야합니까? 이 시나리오에 대한 예제를 제공 할 수 있습니까? – weberc2

관련 문제