Ligeras variantes de formularios ya publicados por varios otros ...
using System;
...
public override bool Equals (object obj) {
return Equals(obj as SomeClass);
}
public bool Equals (SomeClass someInstance) {
return Object.ReferenceEquals(this, someInstance)
|| (!Object.ReferenceEquals(someInstance, null)
&& this.Value == someInstance.Value);
}
public static bool operator ==(SomeClass lhs, SomeClass rhs) {
if(Object.ReferenceEquals(lhs, null)) {
return Object.ReferenceEquals(rhs, null);
}
return lhs.Equals(rhs);
//OR
return Object.ReferenceEquals(lhs, rhs)
|| (!Object.ReferenceEquals(lhs, null)
&& !Object.ReferenceEquals(rhs, null)
&& lhs.Value == rhs.Value);
}
public static bool operator !=(SomeClass lhs, SomeClass rhs) {
return !(lhs == rhs);
// OR
return (Object.ReferenceEquals(lhs, null) || !lhs.Equals(rhs))
&& !Object.ReferenceEquals(lhs, rhs);
}
Tratando de encontrar una manera de poner en práctica operador == usando Iguales para evitar la duplicación de la lógica de comparación de valor ... sin ningún tipo de pruebas redundantes (ReferenceEquals llamadas w/los mismos parámetros) o pruebas innecesarias (esto no puede ser nulo en el método instancia.Equals) y sin condicionales explícitos ("ifs"). Más de una idea más que cualquier cosa útil.
más cercano que puedo pensar es esto, pero siente como tiene que ser posible sin un método adicional :)
public bool Equals (SomeClass someInstance) {
return Object.ReferenceEquals(this, someInstance)
|| (!Object.ReferenceEquals(someInstance, null) && EqualsNonNullInstance(someInstance);
}
public static bool operator ==(SomeClass lhs, SomeClass rhs) {
return Object.ReferenceEquals(lhs, rhs)
|| (!Object.ReferenceEquals(lhs, null) && !Object.ReferenceEquals(rhs, null) && lhs.EqualsNonNullInstance(rhs));
}
//super fragile method which returns logical non-sense
protected virtual bool EqualsNonNullInstance (SomeClass someInstance) {
//In practice this would be a more complex method...
return this.Value == someInstance.Value;
}
Recordando lo tedioso y propenso a errores que todo esto es (estoy casi seguro hay un error en el código anterior ... que todavía chupa porque ¿quién quiere una subclase Tipo acaba de hacer comprobaciones de igualdad un poco más sencillo?), en adelante creo que voy a crear algunos métodos estáticos que se encargan de todos los cheques nulos y aceptar un delegado o requerir e interfaz para realizar la comparación de valores (la única parte que realmente cambia Tipo a Tipo).
Sería genial si pudiéramos simplemente agregar atributos en los campos/propiedades/métodos que necesitan ser comparados y dejar que el compilador/tiempo de ejecución maneje todo el tedio.
También asegúrese de que los valores de GetHashCode() sean iguales para las instancias en las cuales .Equals (object) devuelve true o crazy shit.
Wont este explotar si objeto 'obj' es una estructura? – row1
@ row1 No. La estructura será encuadrada, y la estructura encuadrada tendrá como resultado 'null' cuando se evalúe el operador' as'. Si el tipo definido es una estructura, entonces necesitarías hacer un reparto explícito en lugar de usar 'as' (o usar la versión que puede agregar nulos de la estructura). También eliminaría las comprobaciones nulas si fuera una estructura no nulable. – Servy
Woow muy simple y consise Implementación, me gusta, gracias. –