2011-07-25 16 views
7

나는 ==!= 연산자를 오버로드하는 클래스를 구현했습니다.우선 순위 연산자 우선 순위

이것은 제대로 작동하는 것 같습니다. 그러나, 나는 'type' defines operator == or operator != but does not override Object.Equals(object o) 경고를 얻는다.

좋아요, 그래서 Equals를 구현했습니다. 하지만 이제는 경고 'type' defines operator == or operator != but does not override Object.GetHashCode()이 나옵니다.

어떤 시점에서 종료됩니까? 아니면 ==!=을 오버로드하려고하기 때문에 끊임없이 요구되는 길을 걸어 왔습니까?

+3

빠른 용어 수정 : * 연산자를 재정의하지 마십시오. * 오버로드 *합니다. –

+1

'Equals'을 오버라이드 (override) 할 때, 해시 함수를 기반으로 동등성을 검사하므로'GetHashCode'도 오버라이드해야합니다. –

+0

@IgorisAzanovas 아니요, Equals는 해시 함수를 기반으로 평등을 검사하지 않습니다 (과부하가 발생하지 않는 한 특별히 코드를 작성하지 않는 한). 해시 함수는 해시 된 콜렉션을 지원하기 위해 존재하며 고유 값을 생성 할 필요는 없으며, 자주 사용되지 않는 것이 이상적입니다. – Suncat2000

답변

10

어떤 시점에서 종료됩니까?

예, GetHashCode을 구현하면 종료됩니다. Eric Lippertblogged about its importance입니다. 내가 할 수있는 것은 당신이 그를 읽고 신뢰하도록 제안하는 것입니다 :-)

+0

좋아, 그럼 누가 합리적인 해시 값으로 정수 값을 변환 걸리는 좋은 알고리즘을 가리킬 수 있습니까? –

+1

@Darin 왜 "=="연산자를 오버로드 할 때 object.equals()를 재정의해야합니까? – Sandeep

+0

@Jonathon : 유일한 식별 정보가'int' 인 경우, 내장 된'int' 타입은 자신을 해시 값으로 사용합니다. 그걸로 충분하다면 ... – porges

1

예, GetHashCode을 무시하면 끝납니다.

평등 연산자와 Equals을 구현할 때 해당 유형에 대한 사용자 지정 해시 코드를 제공하는 구현을 제공하는 것은 프로그래머의 책임입니다.

자세한 내용은 this MSDN reference을 참조하십시오.