문제

.NET에서 클래스에 클래스 객체 인 멤버가 포함 된 경우 해당 멤버를 속성 또는 방법으로 노출해야합니까?

도움이 되었습니까?

해결책

당신이하는 모든 일이 현재 객체의 상태와 관련된 객체 인스턴스를 노출시키는 것입니다. 속성을 사용해야합니다.

메모리 객체에 액세스하고 해당 값을 반환하는 것보다 더 많은 논리가 있거나 현재 객체의 상태에 광범위한 영향을 미치는 동작을 수행 할 때 방법을 사용해야합니다.

다른 팁

개념적으로 객체의 상태를 나타내는 모든 것에 대한 속성을 사용해야합니다. 검색이 반복적으로 사용하지 않아야 할만 큼 비용이 많이 드는 작업이 아닌 한 속성을 사용해야합니다.

에서 MSDN:

클래스 라이브러리 디자이너는 종종 클래스 멤버를 속성 또는 방법으로 구현하는 것을 결정해야합니다. 일반적으로 방법은 동작을 나타내고 속성은 데이터를 나타냅니다. 다음 지침을 사용하여 이러한 옵션 중에서 선택할 수 있도록 도와줍니다.

  • 멤버가 논리 데이터 구성원 인 경우 속성을 사용하십시오. 다음 회원 선언에서 이름은 클래스의 논리적 회원이기 때문에 속성입니다.

    public string Name
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
    
  • 다음과 같은 경우 메소드를 사용합니다.

    • 작업은 Object.tostring과 같은 변환입니다.
    • 작업은 사용자에게 결과를 캐싱하는 것을 고려해야 할 정도로 비용이 많이 듭니다.
    • Get Accessor를 사용하여 속성 값을 얻는 것은 관찰 가능한 부작용이 있습니다.
    • 연속으로 회원을 두 번 호출하면 결과가 다릅니다.
    • 실행 순서가 중요합니다. 유형의 속성을 순서로 설정하고 검색 할 수 있어야합니다.
    • 멤버는 정적이지만 변경할 수있는 값을 반환합니다.
    • 멤버는 배열을 반환합니다. 반환 배열의 속성은 매우 오해의 소지가있을 수 있습니다. 일반적으로 사용자가 내부 상태를 변경할 수 없도록 내부 배열 사본을 반환해야합니다. 이는 사용자가 쉽게 인덱스 된 속성이라고 가정 할 수 있다는 사실과 함께 비효율적 인 코드로 이어집니다. 다음 코드 예제에서 메소드 속성에 대한 각 호출은 배열 사본을 만듭니다. 결과적으로 배열의 2N+1 사본이 다음 루프에서 생성됩니다.

      Type type = // Get a type.
      for (int i = 0; i < type.Methods.Length; i++)
      {
         if (type.Methods[i].Name.Equals ("text"))
         {
            // Perform some operation.
         }
      }
      

다음 예는 속성과 방법의 올바른 사용을 보여줍니다.

    class Connection
    {
       // The following three members should be properties
       // because they can be set in any order.
       string DNSName {get{};set{};}
       string UserName {get{};set{};}
       string Password {get{};set{};}

       // The following member should be a method
       // because the order of execution is important.
       // This method cannot be executed until after the 
       // properties have been set.
       bool Execute ();
    }

그것은 문제와 관련이 없습니다.

값이 객체의 상태에 대한 세부 사항이라면 속성이어야합니다.

객체에서 약간의 동작을 수행하는 경우 방법이어야합니다.

재산. 속성은 기본적으로 '저렴한'방법입니다. 물체에 대한 참조를 얻거나 설정하는 것은 매우 저렴합니다.

명확히하기 위해, 속성은 일반적으로 객체의 내부 상태를 나타내야합니다. 그러나 부동산 또는 방법으로 멤버를 구현하면 사용자에게 통화가 얼마나 비싸지는 지 알 수 있습니다.

속성 클래스 내 인스턴스에 값을 읽고 할당합니다.

방법은 클래스에 할당 된 데이터로 무언가를 수행합니다.

개요

일반적으로 속성은 다음과 같은 객체에 대한 데이터를 저장합니다. 이름, 및 방법은 객체가 수행하도록 요청할 수있는 동작입니다. 이동하다 또는 보여 주다. 때로는 어떤 클래스 멤버가 속성이어야하는지, 어떤 방법이 방법이어야하는지는 분명하지 않습니다. 안건 컬렉션 클래스 (VB)의 방법은 데이터를 저장하고 검색하며 색인화 된 속성으로 구현할 수 있습니다. 반면에, 구현하는 것도 합리적 일 것입니다. 안건 방법으로.

통사론

클래스 멤버를 사용하는 방법은 재산 또는 방법으로 표현되어야하는지에 대한 결정 요인이 될 수 있습니다. 매개 변수화 된 속성에서 정보를 검색하기위한 구문은 함수로 구현 된 방법에 사용되는 구문과 거의 동일합니다. 그러나 이러한 값을 수정하기위한 구문은 약간 다릅니다.

클래스의 구성원을 속성으로 구현하는 경우 다음과 같은 방식으로 값을 수정해야합니다.

thisObject.이 프로페티 (색인) = newValue

클래스 멤버가 메소드로 구현되면 수정되는 값은 논쟁을 사용하여 수정해야합니다.

thisobject.thisproperty (index, newValue)

오류

값을 읽기 전용 속성에 할당하려는 시도는 메소드와 유사한 호출과 다른 오류 메시지를 반환합니다. 올바르게 구현 된 클래스 멤버는 해석하기 쉬운 오류 메시지를 반환합니다.

나는 이전에 사용 속성과 방법에 대해 혼란 스러웠다. 그러나 지금 나는이 규칙을 사용하고 있습니다 MSDN 지침:

방법은 행동을 나타내고 속성은 데이터를 나타냅니다. 특성은 필드처럼 사용되어야합니다. 즉, 속성은 계산적으로 복잡하거나 부작용을 생성해서는 안됩니다. 다음 지침을 위반하지 않으면 경험이 적은 개발자가 사용하기 쉽기 때문에 방법이 아닌 속성 사용을 고려하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top