3

Equals()를 구현/재정의하고 GetHashCode를 재정의하기 위해 해당 필드 (예 : Ab 및 Ac)를 사용하여 IEquatable <>을 구현하는 클래스 A가 있습니다.(), 모든 것이 잘 작동하는데, 99 %의 시간입니다. 클래스 A는 인터페이스 D에서 상속받은 계층 구조 (클래스 B, C)의 일부입니다. 그들은 모두 사전 사전에 함께 저장할 수 있습니다. 따라서 모든 기본 고유 Equals()/GetHashCode()를 수행 할 때 편리합니다.GetHashCode()를 오버라이드하는 형식에 Object.GetHashCode()를 사용하는 방법

그러나 A를 구성하는 동안 A.b 및 A.c에 대한 값을 얻기 위해 언젠가는 작업해야합니다. 그 일이 발생하는 동안, 나는 지어지고있는 인스턴스에 대한 참조를 저장하고 싶다. 이 경우에는 A가 제공하는 기본 Equals()/GetHashCode() 재정의를 사용하고 싶지 않습니다. 따라서 ReferenceEqualityComparer를 구현하려고합니다. 이는 Object의 Equals()/GetHashCode() : A는 Object.GetHashCode()를 오버라이드 (override) 이후

private class ReferenceEqualityComparer<T> : IEqualityComparer<T> 
    { 
     #region IEqualityComparer<T> Members 
     public bool Equals(T x, T y) 
     { 
      return System.Object.ReferenceEquals(x, y); 
     } 

     public int GetHashCode(T obj) 
     { 
      // what goes here? I want to do something like System.Object.GetHashCode(obj); 
     } 
     #endregion 
    } 

문제는 I (A 외부)는의 인스턴스에 대한 Object.GetHashCode()를 호출 할 수있는 방법이다?

한 가지 방법은 A가 IEquatable <>을 구현하지 않고 내가 만든 임의의 사전에 항상 IEqualityComparer <>을 제공하는 것이지만 다른 대답을 기대하고 있습니다.

감사

+2

:

전체 자세한 내용은이 질문에 대한 답과 ObjectReferenceEqualityComparer<T>의 구현을 참조하십시오. IEqualityComparer <>를 사용하여 빠져 나오십시오. –

답변

-1

전화 상호 운용성을 통해 CLR의 기본 구현 : object.ReferenceEquals에 대한 Default implementation for Object.GetHashCode()

+0

링크는 학문적으로 흥미 롭지 만 실제로는 RuntimeHelpers.GetHashCode()를 사용해야합니다. –

+0

사실, 그 것에 대해 몰랐습니다. 그것은 단지 동일한 기본 interop 메서드를 호출하므로 기능상의 차이는 없습니다 (예 : 변경된 경우를 위해 게시 된 API를 사용해야합니다 ...) – piers7