2012-05-17 1 views
3

Equals 메서드를 구현할 때 다음 문서에서 서로 다른 접근 방식에 대해 이야기하는 이유는 무엇입니까? [MSDN] Guidelines for Overriding Equals() and Operator == (C# Programming Guide) Equals 구현에 대한 C#의 다른 MSDN 지침

  • [MSDN] Implementing the Equals Method
  • (더 최근의) 두 번째 문서

    • 는 명시 적으로 Equals (같은이 public bool Equals(MySuperTrooperClass o))의 강력한 형식의 버전을 구현하지 않습니다.

      가이드 중 하나에서 강력한 형식의 메서드를 삭제하고 프로덕션 코드에서 사용해야하는 방법은 무엇입니까?

    +0

    유형이 IEquatable 을 구현하는 경우 강력한 유형화 된 유형 만 사용해야합니다. 이상하게도 그 가이드 중 어느 것도 IEquatable 을 언급하지 않습니다 ... –

    답변

    3

    강력한 형식의 버전을 삭제해도 이점이 없습니다. 또한 같음을 (객체)를 구현하는 것 외에, 모든 클래스는 성능 향상을 위해 자신의 유형, 에 대한 같음 (유형)를 구현하는 것이 좋습니다

    정반대, 첫 페이지 자체는 언급하고있다.

    이것은 값 유형에 대해 두 가지 사실입니다.

    약식 입력 버전이 System.Object에 정의되어 있기 때문에 두 번째 페이지가 전혀 문제가되지 않는다고 가정합니다. 강력한 형식의 버전은 일반적으로 IEquatable<T>을 구현하는 데 사용되며 documentationEquals(T)Equals(object) 사이의 상호 작용을 나타냅니다.

    0

    성능을 향상 시키려면 강력한 형식의 같음을 구현해야합니다. 첫 번째 기사에 쓰여 있듯이

    0

    두 가지가 동일한 값을 갖고 있는지 확인하려는 경우 ==
    두 인스턴스가 실제로 동일한 인스턴스로 순환하는지 확인하려면 Equals ().

    Equals()가 true 인 경우에만 ==가 true 여야합니다.

    GetHashCode()와 관련하여 - Dictionary와 같은 구조체를 포함하는 경우에는이 특정 메서드를 사용하여 데이터를 구별합니다. 데이터를 구분하는 방법은 사용자가 결정할 수 있지만 GetHashCode()는 변경해야하는 개체의 값이 올바로 작동하는 동안 변경하면 안됩니다. 개체 수명 동안 동일한 값을 유지해야 함을 의미합니다.

    당신은 그런 식으로 뭔가를해야만 할 때 :

    MyClass A = new MyClass(); 
    MyClass B = A; 
    

    주소가 포인터 B 주소와 동일한 값을 가지는 포인터 경우 실제로 확인 (A ==의 B) 여부를 확인

    .
    따라서 일반적인 개발의 99.99 %에서 Equals()를 구현할 필요가 없습니다.

    1

    많은 원시 형에 Equals 과부하 마이크로 소프트의 결정의 불행한 부작용은 비록 ((Object)X).Equals(Y) 때문에 암시 적 변환의 (이 그것을해야한다), X.Equals(Y)는하지 않습니다 동치 관계로 작동합니다 많은 경우가 있다는 것입니다.예를 들어 3.Equals(3.0)은 false를 반환하지만 (3.0).Equals(3)은 true를 반환합니다. == 연산자가 상당히 불량하지는 않지만 (일반적으로 X==Y, Y==X) X = Int64.MaxValue, Y = X-1 및 Z = (Double) X 인 경우 등가 관계를 여전히 지정하지 않습니다. X == Z 및 Y == Z이지만 X! = Y).

    아마도 마이크로 소프트가 Equals(Object) 동일하게 작동 Equals()의 과부하를 제공에 대한 조언을 떨어 ​​이유는 암시 적 캐스트가 동등한 관계로서 행동의 전 능력이 렌더링 수있는 반면, 후자는 함께, 등가 관계로서 행동해야한다는 것입니다 예외 없음.