2009-09-20 14 views
21

Powiedzmy, że masz dwie różne klasy, z których każda ma własną implementację równań; który z nich jest używany? Co jeśli tylko jeden z nich ma taki? A może żaden z nich? Czy którakolwiek z poniższych linii jest odpowiednikiem?C#: W jaki sposób static object.Equals sprawdza równość?

object .Equals(first, second) 
first .Equals(second) 
second .Equals(first) 

Zgaduję, że pierwsze dwa mogą być równoważne, ale tak naprawdę nie mam pojęcia.

Co tak naprawdę robi?

Odpowiedz

40

Zasadniczo robi trzy rzeczy:

  • Sprawdzenie równości odniesienia (return true jeśli tak)
  • Sprawdź nieważności odniesienia (return false jeśli jedna wartość jest null; teraz null == null case został obsługiwane)
  • Sprawdzenie równości wartości z first.Equals(second)

zamawiania nie powinno znaczenia, czy zarówno wartości mają dobrze zachowane implementacje równości, ponieważ równość powinna być zaimplementowana tak, aby x.Equals(y) implikowała y.Equals(x). Jednak zainstalowana przeze mnie dokumentacja trybu offline stwierdza, że ​​jest to pierwsze. Wymóg (drugi) (lub objA.equals (objB) do używania prawdziwego nazewnictwa parametrów). online documentation nie wspomina o tym, co ciekawe.

Wystarczy, aby wszystkie tego betonu, realizacja mogłaby wyglądać następująco:

public static bool Equals(object x, object y) 
{ 
    if (x == y) // Reference equality only; overloaded operators are ignored 
    { 
     return true; 
    } 
    if (x == null || y == null) // Again, reference checks 
    { 
     return false; 
    } 
    return x.Equals(y); // Safe as we know x != null. 
} 
+1

Należy zaznaczyć, że główna różnica między statycznym 'Object.Equals' a wirtualnym' first .Equals (second) 'jest taka, że ​​ostatnia ** ulegnie awarii **, jeśli' first' jest pustym odwołaniem. –

1

Domyślnie obiekt równoważność jest określony przez adres obiektu w pamięci. Jeśli obie instancje mają taki sam adres pamięci, są równe.

Może to jednak zostać przeciążone wewnątrz obiektu, dzięki czemu programiści mogą porównywać dwa obiekty, które w tej samej lokalizacji pamięci są niezmienione. Na przykład, jeśli masz warstwę dostępu do danych, w której każdy obiekt miał swój identyfikator rekordu danych z bazy danych, możesz porównywać obiekty na podstawie identyfikatora. Aby uzyskać tę funkcję, można

Możesz overload operators.

+0

Nie można przesłonić operatorów w języku C#. Możesz * przeciążyć * operatorów lub * przesłonić * metodę Equals. –

+0

Dzięki, naprawiłem to. – Soviut

Powiązane problemy