Uso ReSharper para generar miembros con igualdad. Opcionalmente implementará IEquatable<T>
y reemplazará a los operadores si así lo desea (lo que por supuesto nunca hace, pero de todos modos es genial).
La implementación de Equals incluye una anulación de Object.Equals(Object)
, así como una variante fuertemente tipada (que puede evitar la verificación innecesaria de tipos). La versión de menor tipeo llama a la fuertemente tipada después de realizar una verificación de tipo. La versión fuertemente tipada realiza una verificación de igualdad de referencia (Object.ReferenceEquals(Object,Object)
) y luego compara los valores de todos los campos (bueno, solo aquellos que le indica al generador que incluyan).
En cuanto a GetHashCode
, una factorización inteligente de GetHashCode
los valores del campo se combinan (usando unchecked
para evitar excepciones de desbordamiento si se utiliza la opción del compilador checked
). Cada uno de los valores del campo (aparte del primero) se multiplica por números primos antes de combinarse. También puede especificar qué campos nunca serán nulos, y eliminará cualquier comprobación nula.
Esto es lo que se obtiene por su clase Polygon
pulsando ALT+Insert
luego seleccionando "Generar Igualdad miembros":
public class Polygon : IEquatable<Polygon>
{
public Point[] Vertices { get; set; }
public bool Equals(Polygon other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Vertices, Vertices);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Polygon)) return false;
return Equals((Polygon) obj);
}
public override int GetHashCode()
{
return (Vertices != null ? Vertices.GetHashCode() : 0);
}
}
Algunas de las características que hablé anteriormente no se aplican ya que sólo hay un campo . Tenga en cuenta también que no ha verificado el contenido de la matriz.
En general, ReSharper extrae una gran cantidad de código excelente en cuestión de segundos. Y esa característica es bastante baja en mi lista de cosas que hace que ReSharper sea una herramienta increíble.
Usted parece no estar buscando Igual a la generación de código, pero para un implementador algoritmo genérico. Creo que no tienes suerte aquí. – erikkallen