2009-10-06 8 views
6

Podczas wdrażania operatora ==, mam wrażenie, że brakuje mi pewnych istotnych punktów.
Dlatego szukam najlepszych praktyk w tym zakresie.
Poniżej kilka podobnych pytań myślę o:Jakie są najlepsze praktyki dotyczące wdrażania operatora == dla klasy w języku C#?

  • Jak czysto obsługiwać porównanie odniesienia?
  • Czy powinien zostać zaimplementowany poprzez interfejs podobny do IEquatable<T>? Lub przesłonić object.Equals?
  • A co z operatorem !=?

(ta lista może nie być wyczerpująca).

+3

Sprawdź następujące tematy: http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c, http://stackoverflow.com/questions/1421289/icomparable-andequals, http://stackoverflow.com/questions/660566/override-equals-and-gethashcode-question, http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types – Groo

Odpowiedz

3
  • Jeśli zaimplementujesz ==, przesłonisz .Equals i. GetHashCode
  • realizować! = Oraz
  • Sprawdź zerowych odniesień korzystających object.ReferenceEquals inaczej operator recurse
+2

Właściwie, ty MUSISZ wdrożyć! = Również, w przeciwnym razie C# nie pozwoli ci się skompilować. –

+0

Dobra uwaga. Zapomniałem tego. – dkackman

4

każdym razem wdrożyć operatora ==, należy również wdrożyć !=, IEquatable<T> i zastąpić Object.Equals() i Object.GetHashCode() dla zachowania spójności dla użytkownika twojej klasy.

Biorąc pod uwagę klasę, tu jest mój zwykły realizacja:

public bool Equals(MyClass other) { 
     if (ReferenceEquals(other, null)) 
      return false; 
     if (ReferenceEquals(other, this)) 
      return true; 
     return // your equality code here 
    } 

    public override bool Equals(object obj) { 
     return Equals(obj as MyClass); 
    } 

    public override int GetHashCode() { 
     return // your hash function here 
    } 

    public static bool operator ==(MyClass left, MyClass right) { 
     return Equals(left, right); 
    } 

    public static bool operator !=(MyClass left, MyClass right) { 
     return !(left == right); 
    } 
+0

To. Jeśli zaimplementujesz na początku operatora <(mniej niż), możesz użyć tego samego operatora do wdrożenia każdego innego operatora. tzn .: == można wyrazić jako! (lewy

4

Najczęstszym rozwiązaniem jest nie go obsłużyć. Wartością domyślną jest porównanie porównawcze, które ogólnie jest odpowiednie dla obiektów klas.

Po pierwsze, chcesz być bardzo pewny, że potrzebujesz zachowania typu wartości.

+2

Niech będzie wyraźna odpowiedź na pytanie, a następnie porada, aby powiedzieć komuś, aby zmienić sposób, w jaki robią różne rzeczy. –

0

Do takich zadań należy używać Resharper. Nie ma sensu wymyślać koła.

+1

To jest kosztowne rozwiązanie dla tak trywialnego zadania. – spender

+1

Co więcej, dla niektórych zadań, takich jak ten, wolałbym, aby programista * nauczył się, jak zrobić coś właściwie * niż mieć jakieś narzędzie do wykonania pracy dla niego, i nigdy Zastanowiłem się jeszcze raz. –

+0

@spender Jestem pewien, że wiesz, że R # może być używany nie tylko do takich banalnych zadań. @Mike Powinni być w stanie napisać to ręcznie, ale powinni też mieć narzędzia, które pozwolą im być bardziej produktywnymi i nie będą musieli go pisać. –

Powiązane problemy