2015-11-23 17 views
6

Secondo this MSDN documentazionePerché i risultati dei metodi Equals e ReferenceEquals differiscono anche se le variabili sono tipi di riferimento?

Se l'istanza corrente è un tipo di riferimento, i Equals (Object) Test metodo per l'uguaglianza di riferimento, e una chiamata al Equals metodo (oggetto) è equivalente a una chiamata a il metodo ReferenceEquals.

allora perché codice seguente genera due diversi frutto di metodo chiama Equals metodo che restituisce il metodo Vero e ReferenceEquals ritorno falsa, anche se il obj e obj1 è il tipo di riferimento come IsClass proprietà restituisce true.

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     var obj = new { a = 1, b = 1 }; 
     var obj1 = new { a = 1, b = 1 }; 

     Console.WriteLine("obj.IsClass: " + obj.GetType().IsClass); 

     Console.WriteLine("object.ReferenceEquals(obj, obj1): " + object.ReferenceEquals(obj, obj1)); 

     Console.WriteLine("obj.Equals(obj1): " + obj.Equals(obj1)); 
    } 
} 

uscita:

obj.IsClass: Vero

object.ReferenceEquals (obj, obj1): False

obj.Equals (obj1): Vero

+2

I tipi anonimi sovrascrivono Equals e GetHashCode –

+0

Leggi di più della pagina a cui sei collegato: "Poiché la classe Object è la classe base per tutti i tipi in .NET Framework, il metodo Object.Equals (Object) fornisce il valore predefinito confronto di uguaglianza per tutti gli altri tipi, tuttavia i tipi spesso sovrascrivono il metodo Equals per implementare l'uguaglianza dei valori ". –

+0

ho perso il punto in cui gli oggetti anonimi sovrascrivono lo stesso metodo. @JenishRabadiya era evidente per me stesso xD quindi ho dimenticato di dirlo. –

risposta

6

obj e obj1 fare riferimento a 2 oggetti diversi, quindi object.ReferenceEquals() restituirà false.

Equals() restituisce true, perché il compilatore implementa Equals() per i tipi anonimi. Restituirà vero se tutte le proprietà di entrambi gli oggetti hanno gli stessi valori.

+0

Grazie! accetterà risposta nel prossimo paio di minuti. :) –

3

tipi Tutti anonimi hanno un Equals di override che funziona da:

  1. Se il primo oggetto è nullo per poi tornare true se il secondo è nullo, false altrimenti.
  2. Se il secondo oggetto è nullo, restituire false.
  3. Se i due oggetti sono di tipi diversi, restituire false (ma tutti gli oggetti anonimi che hanno le stesse proprietà che hanno lo stesso nome nello stesso tipo nello stesso oggetto sono dello stesso tipo).
  4. Passare attraverso ciascuna proprietà, se chiamando Equals sui valori che i due oggetti hanno per tale proprietà è false, restituisce false.
  5. Ritorno vero.

(Hanno anche un GetHashCode che funziona combinando le chiamate GetHashCode su ogni proprietà).

Se non fosse stato per questo, allora GroupBy, Distinct, Union e simile non poteva lavorare con le proprietà anonimi, dal momento che ciascuno di questi metodi ha bisogno di un concetto di uguaglianza al lavoro.

ReferenceEquals funziona restituendo true se i due oggetti sono in effetti lo stesso oggetto, false se non lo sono.

L'impostazione predefinita per un oggetto non anonimo è per Equals per restituire la stessa cosa di ReferenceEquals. Se non fosse anonimo, e si desiderasse qualcosa di diverso da questo, l'autore avrebbe fornito un override Equals e avrebbe avuto maggiore flessibilità nel modo in cui lo ha fatto.

Problemi correlati