1 - riferimento uguale controlla se le variabili di tipo due riferimento (classi, non struct) sono riferiti allo stesso indirizzo di memoria.
2 - The Equals virtuali() controlla metodo se due oggetti sono equivalenti.Diciamo che avete questa classe:
class TestClass{
public int Property1{get;set}
public int Property2{get;set}
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
}
e si crea un'istanza di 2 oggetti da quella classe:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
anche se i due oggetti non sono la stessa istanza di TestClass, la chiamata a o1.Equals (o2) restituirà true.
3 - Il metodo statico Equals viene utilizzato per gestire i problemi quando nel controllo è presente un valore nullo. Immaginate questo, per esempio:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
Se si tenta questo:
o1.Equals(o2);
si wil ottenere un NullReferenceException, perché i punti da O1 a nulla. Per risolvere il problema, procedere come segue:
Object.Equals (o1, o2);
Questo metodo è preparato per gestire riferimenti null.
4 - L'interfaccia IEquatable è fornita da .Net quindi non è necessario eseguire cast nel metodo Equals. Se il compilatore scopre di aver implementato l'interfaccia in una classe per il tipo che si sta tentando di controllare per l'uguaglianza, darà la priorità di quel metodo sull'override Object.Equals (Object). Per esempio:
class TestClass : IEquatable<TestClass>
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
#region IEquatable<TestClass> Members
public bool Equals(TestClass other)
{
return (other.Property1 == this.Property1 && other.Property2 == this.Property2);
}
#endregion
}
ora se facciamo questo:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
Il metodo chiamato è Equals (testclass), prima Equals (Object).
5 - L'operatore == di solito corrisponde a ReferenceEquals, controlla se due variabili puntano allo stesso indirizzo di memoria. Il trucco è che questo operatore può essere ignorato per eseguire altri tipi di controlli. Nelle stringhe, ad esempio, controlla se due diverse istanze sono equivalenti.
Questo è un link utile per capire uguaglianze in .Net meglio:
Eccellente. Gli esempi aiutano veramente, ma c'è un errore di battitura nel tuo punto 4, dove IEquatable.Equals usa ancora 'convertedObj' – PaulG
Grazie PaulG, ora è riparato! =] – mverardo