2009-09-20 11 views
21

Supponiamo che tu abbia due classi diverse in cui ciascuna ha la propria implementazione di Equals; quale è usato? E se solo uno di loro ne avesse uno? O nessuno di loro? Qualcuna delle seguenti righe è equivalente?C#: Come funziona l'oggetto statico. Il controllo degli oggetti per l'uguaglianza?

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

Immagino che i primi due potrebbero essere equivalenti, ma non ne ho proprio la minima idea.

Cosa fa veramente?

risposta

40

Fondamentalmente si fa tre cose:

  • Verifica di uguaglianza riferimento (ritorno vero se così)
  • Verifica di nullità riferimento (ritorno false se entrambi i valori è null; ormai il nullo == caso nullo siano stati manipolati)
  • Controllare per l'uguaglianza valore con first.Equals(second)

l'ordinamento non dovrebbe importa se sia i valori hanno implementazioni di uguaglianza ben gestite, poiché l'uguaglianza dovrebbe essere implementata in modo tale che x.Equals(y) implichi y.Equals(x). Tuttavia, la documentazione offline che ho installato non è stata specificata per prima.Equals (second) (o objA.equals (objB) per utilizzare la denominazione reale dei parametri). Lo online documentation non lo menziona, abbastanza interessante.

solo per fare tutto questo cemento, l'attuazione potrebbe essere la seguente:

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

Deve essere evidenziato che la differenza principale tra 'Object.Equals' statici e' first.Equals (secondo) '' virtuale è che quest'ultimo ** non funzionerà ** se 'first' è un riferimento null. –

1

Per impostazione predefinita, oggetto equivalenza è determinata dal indirizzo dell'oggetto in memoria. Se entrambe le istanze hanno lo stesso indirizzo di memoria, sono uguali.

Tuttavia, questo può essere sovraccaricato all'interno dell'oggetto in modo che gli sviluppatori possano confrontare due oggetti che non sono nella stessa posizione di memoria e si considerano uguali. Ad esempio, se si dispone di un livello di accesso ai dati in cui ogni oggetto ha il proprio ID del record di dati dal database, è possibile confrontare l'uguaglianza degli oggetti in base all'ID.

È possibile overload operators produrre questa funzionalità.

+0

Non è possibile eseguire l'override degli operatori in C#. È possibile * sovraccaricare * gli operatori o * sovrascrivere * il metodo Equals. –

+0

Grazie, risolto. – Soviut

Problemi correlati