2010-06-07 3 views
3

.NET에는 자체 평등 비교 기능이 있지만 실제로 어떻게 작동하는지 이해하지는 못합니다..NET 클래스에서 Equals()를 언제 재정의해야합니까?

원하는 Equals() 및 == 동작이 개체의 모든 필드가 다른 개체의 모든 필드와 동일한 지 확인하는 경우 Equals()를 명시 적으로 수행하는 메서드로 재정의해야합니까?

답변

5

클래스로 작업하는 경우 그렇습니다.

참조 형식 (클래스)에서 .NET은 기본적으로 클래스 자체의 값이 아닌 참조 자체를 비교하는 등가 비교를 제공합니다. 필드 별 비교를 원하면 Equals 재정 의가 필요합니다.

구조체 (값 형식)의 경우 기본 비교는 필드 단위로 비교하는 것입니다. the documentation에서

는 :

같음의 기본 구현은 값 형식에 대한 참조 유형에 대한 참조 평등, 비트 평등을 지원합니다. 참조 동일성은 비교되는 객체 참조가 동일한 객체를 참조 함을 의미합니다. 비트 동등성은 비교되는 객체가 동일한 이진 표현을 가짐을 의미합니다.

+0

문서에서 제안하는 것처럼 bitwise 정확히 "필드 - 의해 - 필드"아닙니다. 참조 형식을 포함하는 구조체가 있으면 참조 된 형식이 같음()을 재정의하는 경우에도 기본 같음() . – dahlbyk

+3

'Equals'를 오버라이드하면 일반적으로'GetHashCode() '를 오버라이드해야한다는 점은 주목할 가치가 있습니다. –

+0

@ Nathan Ernst - +1을 +1합니다. – Ram

1

매우 드물게 수행해야합니다.

클래스의 기본 동작은 ReferenceEquality를 사용하는 것입니다. 두 개의 참조는 정확히 동일한 인스턴스를 가리킬 때만 동일합니다. 이는 비즈니스 오브젝트와 잘 어울립니다. 보통 실제 세계에서 1 오브젝트와 일치하며 중복을 원하지 않습니다.

예외가 있지만 String 클래스는 주목할만한 예입니다. 2 개의 문자열에 대한 동일성은 문자별로 문자를 비교합니다. 그러나 String의 원하는 동작은 값 유형의 동작이며 String에는 'ID'가 없다는 점에 유의하십시오.

관련 문제