1 - La referencia equivale a comprobar si dos variables de tipo de referencia (clases, no estructuras) se refieren a la misma dirección de memoria.
2 - El método virtual Equals() verifica si dos objetos son equivalentes.Digamos que usted tiene esta clase:
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);
}
}
y 2 objetos de esa clase:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
aunque los dos objetos no son la misma instancia de TestClass, la llamada a o1.Equals (o2) volverá verdadero.
3 - El método estático Equals se usa para manejar problemas cuando hay un valor nulo en la verificación. imaginar esto, por ejemplo:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
Si intenta esto:
o1.Equals(o2);
wil conseguir un NullReferenceException, porque los puntos O1 a nada. Para resolver este problema, haga esto:
Object.Equals (o1, o2);
Este método está preparado para manejar referencias nulas.
4 - La interfaz IEquatable es proporcionada por .Net por lo que no es necesario hacer moldes dentro de su método Equals. Si el compilador descubre que ha implementado la interfaz en una clase para el tipo que está tratando de verificar para la igualdad, otorgará prioridad a ese método sobre la anulación Object.Equals (Object). Por ejemplo:
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
}
ahora si hacemos esto:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
El método llamado es iguala a (TestClass), antes de equals (Object).
5 - El operador == generalmente significa lo mismo que ReferenceEquals, verifica si dos variables apuntan a la misma dirección de memoria. El problema es que este operador puede ser anulado para realizar otros tipos de controles. En cadenas, por ejemplo, comprueba si dos instancias diferentes son equivalentes.
Este es un enlace muy útil para entender mejor las igualdades en .Net:
Excelente. Los ejemplos realmente ayudan, pero hay un error tipográfico en su punto 4 donde el IEtabletable.Equals todavía usa 'convertedObj' – PaulG
Gracias PaulG, ¡está arreglado ahora! =] – mverardo