.NET에는 자체 평등 비교 기능이 있지만 실제로 어떻게 작동하는지 이해하지는 못합니다..NET 클래스에서 Equals()를 언제 재정의해야합니까?
원하는 Equals() 및 ==
동작이 개체의 모든 필드가 다른 개체의 모든 필드와 동일한 지 확인하는 경우 Equals()를 명시 적으로 수행하는 메서드로 재정의해야합니까?
.NET에는 자체 평등 비교 기능이 있지만 실제로 어떻게 작동하는지 이해하지는 못합니다..NET 클래스에서 Equals()를 언제 재정의해야합니까?
원하는 Equals() 및 ==
동작이 개체의 모든 필드가 다른 개체의 모든 필드와 동일한 지 확인하는 경우 Equals()를 명시 적으로 수행하는 메서드로 재정의해야합니까?
클래스로 작업하는 경우 그렇습니다.
참조 형식 (클래스)에서 .NET은 기본적으로 클래스 자체의 값이 아닌 참조 자체를 비교하는 등가 비교를 제공합니다. 필드 별 비교를 원하면 Equals 재정 의가 필요합니다.
구조체 (값 형식)의 경우 기본 비교는 필드 단위로 비교하는 것입니다. the documentation에서
는 :
같음의 기본 구현은 값 형식에 대한 참조 유형에 대한 참조 평등, 비트 평등을 지원합니다. 참조 동일성은 비교되는 객체 참조가 동일한 객체를 참조 함을 의미합니다. 비트 동등성은 비교되는 객체가 동일한 이진 표현을 가짐을 의미합니다.
매우 드물게 수행해야합니다.
클래스의 기본 동작은 ReferenceEquality를 사용하는 것입니다. 두 개의 참조는 정확히 동일한 인스턴스를 가리킬 때만 동일합니다. 이는 비즈니스 오브젝트와 잘 어울립니다. 보통 실제 세계에서 1 오브젝트와 일치하며 중복을 원하지 않습니다.
예외가 있지만 String 클래스는 주목할만한 예입니다. 2 개의 문자열에 대한 동일성은 문자별로 문자를 비교합니다. 그러나 String의 원하는 동작은 값 유형의 동작이며 String에는 'ID'가 없다는 점에 유의하십시오.
문서에서 제안하는 것처럼 bitwise 정확히 "필드 - 의해 - 필드"아닙니다. 참조 형식을 포함하는 구조체가 있으면 참조 된 형식이 같음()을 재정의하는 경우에도 기본 같음() . – dahlbyk
'Equals'를 오버라이드하면 일반적으로'GetHashCode() '를 오버라이드해야한다는 점은 주목할 가치가 있습니다. –
@ Nathan Ernst - +1을 +1합니다. – Ram