2012-05-28 4 views
0

저는 몇 가지 클래스로 간단한 응용 프로그램을 만들고 있습니다. 이 모든 것은 에서 Remove 메서드를 사용하려고 할 때 시작되었습니다. 이 방법을 사용하려면 Car 유형의 EqualsGetHashCode 메서드를 재정의해야합니다. 이 상황에서 나는 Car 클래스에 ID 속성을 구현하기로 결정했습니다. 그렇게하면 내 Equals 메서드는 단순히 ID 일치를 확인하고 내 GetHashCode 메서드는 base.GetHashCode()을 반환합니다.클래스에 대한 GUID를 사용하는 경우

이것은 좋은 접근 방법입니까, 아니면 너무 무거운 작은 클래스에 대한 GUID를 구현하고 있습니까? 위에서 설명한 이유가 없으면 그럴 필요가 없습니다. 이 Car 유형의 고유성에 대한 유일한 요구 사항은 속한 List<T> 컬렉션 내에서 고유해야한다는 것입니다. GUID 속성을 추가하는 것은 GetHashCode 주변의 가장 빠른 방법처럼 보였습니다. BTW, 내 차 유형에 int 속성이 없습니다.

+2

그냥 명확히하기 위해서는 ['EqualityComparer '] (HTTP를 사용 기본적으로 오버라이드 (override)를 필요로하지 않는'Remove' 방법 : // msdn.microsoft.com/en-us/library/cd666k3e.aspx). –

+0

그게 도움이 아담, 감사합니다; 나는 단지 기본 구현을 사용하고 있었지만 목록에있는 객체를 제거하지는 않았습니다. 그래서 저는 여러분이 Equals()를 오버라이드 (override) 할 필요가있는 것과 같은 소리를내는 자료를 읽고 발견했습니다. GetHashCode()를 재정의해야했습니다. –

답변

1

:이 항목 대신 제거되어야 하는지를 나타내는 술어를 지정할 수 있습니다

myList.RemoveAll(x => x.ID == myCar.ID); 

(당신이 하나 개의 항목 만 제거하는 것이 중요하지 않습니다) . 당신이 설명하는 방법으로 EqualsGetHashCode 구현


나를 극도로 dodgey 파업 - 당신의 Equals 구현이 두 개체를 배치 할 수 있도록 동일한 값을 반환을 필요로 true 다음 GetHashCode 방법을 반환하는 경우 해시 테이블 내의 같은 버킷 동일한인스턴스에 대해 동일한 구현 ID를 가지고 있는지 여부에 관계없이 기본 구현 인 GetHashCode 구현이 거의 확실하게 다른 값을 반환하기 때문에 귀하의 구현은이 기준과 일치하지 않습니다.

EqualsGetHashCode을 구현하는 것은 완전히 사소하지 않으며 대체로 대안이있는 경우 일반적으로 수행하지 않을 수도 있습니다.당신이 정말로 이렇게 할 경우 이러한 resoruces에서 살펴 :

또한 해시 코드는 없습니다 GUIDs

+0

내 질문의 어느 부분에서 해시 코드가 guid라고 생각한다고 제안 했나요? –

+0

@AndrewBSchultz "좋은 접근입니까, 아니면 너무 무거운 작은 클래스에 대한 GUID를 구현합니까?", 제목 : – Justin

+0

OK. GUID가 해시 코드가 아니라는 것을 알고 있습니다. GUID는 Equals() 구현에서 사용하기위한 것이고 GetHashCode() 재정의는 내 생각에 단순히 Equals() 메서드를 재정 의하여 생겨난 요구 사항입니다. 내 속성에서 고유 한 int를 생성하는 방법을 모르기 때문에 base.GetHashCode를 사용했습니다. 그래서 "내 차 유형에 int 속성이 없습니다"라고 말한 것입니다. –

3

위에서 설명한 이유가 없으면 필요하지 않습니다.

클래스가하는 경우하지 논리적으로 ID를 가지고, 그것은 확실히 단지 평등을 위해 그것을 포함하는 이상한 것 같다.

예를 들어 에 대해 동일한 속성을 가진 인스턴스가 두 개있는 경우 ID가 서로 다를 경우은 실제로는 동일하지 않습니까? 그렇다면 잠재적으로 Equals/GetHashCode의 기본 구현을 사용하여 참조 동일성을 사용하는 것이 좋습니다. 동일한 ID를 가진 두 개의 객체를 사용하는 경우, 동일한 객체에 대한 두 개의 참조를 대신 사용하면됩니다.

정말 모든 것이 컨텍스트에 따라 다르며 그만큼 많이주지는 않았지만 ID가 인 경우에만이라는 문자를 추가하면 디자인 냄새가 날 것입니다. 대신 RemoveAll를 같음을 구현하고 GetHashCode 그냥 사용의

+0

감사합니다 존 - 내가 ID 없이는 동일한 목록에 같은 속성을 가진 두 개의 객체를 허용하지 않을 것입니다. 컬렉션. 그러나 List.Remove 메소드의 목표는 다음과 같습니다. 목록은 소유자라고하는 다른 유형의 속성입니다. 소유자 및 그의 목록 의 인스턴스는 저장소에 지속됩니다. 나중에, 그들은 회수 될 수 있고, 1 대의 차는 제거 될 수있다. 제거 할 ID를 식별하기 위해 ID를 사용했지만 호출자가 제거하기 전에 목록을 인스턴스화해야하므로 참조 평등이 작동합니다. 참조 할 수 있도록 도와 주셔서 감사합니다. –