La implementación de Igual() para los tipos de referencia es más difícil de lo que parece. Mi aplicación canónica actual es la siguiente:¿Cuál es la "mejor" implementación canónica de Equals() para los tipos de referencia?
public bool Equals(MyClass obj)
{
// If both refer to the same reference they are equal.
if(ReferenceEquals(obj, this))
return true;
// If the other object is null they are not equal because in C# this cannot be null.
if(ReferenceEquals(obj, null))
return false;
// Compare data to evaluate equality
return _data.Equals(obj._data);
}
public override bool Equals(object obj)
{
// If both refer to the same reference they are equal.
if(ReferenceEquals(obj, this))
return true;
// If the other object is null or is of a different types the objects are not equal.
if(ReferenceEquals(obj, null) || obj.GetType() != GetType())
return false;
// Use type-safe equality comparison
return Equals((MyClass)obj);
}
public override int GetHashCode()
{
// Use data's hash code as our hashcode
return _data.GetHashCode();
}
creo que esto cubre toda la esquina (herencia y tales casos), pero puedo estar equivocado. ¿Qué piensan ustedes?
Mi implementación es "compartida". Como puede ver, al final de Equals (Object) hay una llamada a Equals (MyClass). Soy consciente de los problemas de mutabilidad y GetHashCode(); pero es una observación importante. Me ha mordido varias veces. Lástima que no hay una forma "fácil" de declarar solo "clases" de solo lectura. –
El enlace está roto por ahora. – Restuta