Me parece que mi autocumplen Equals()
y GetHashCode()
con frecuencia para implementar la semántica de que los objetos comerciales con los mismos valores de propiedad son iguales. Esto lleva a que el código sea repetitivo de escribir y frágil de mantener (la propiedad se agrega y una o ambas anulaciones no se actualizan).Simplificar anulando Equals(), GetHashCode() en C# para una mejor capacidad de mantenimiento
El código termina buscando algo como esto (los comentarios sobre la aplicación son bienvenidos):
public override bool Equals(object obj)
{
if (object.ReferenceEquals(this, obj)) return true;
MyDerived other = obj as MyDerived;
if (other == null) return false;
bool baseEquals = base.Equals((MyBase)other);
return (baseEquals &&
this.MyIntProp == other.MyIntProp &&
this.MyStringProp == other.MyStringProp &&
this.MyCollectionProp.IsEquivalentTo(other.MyCollectionProp) && // See http://stackoverflow.com/a/9658866/141172
this.MyContainedClass.Equals(other.MyContainedClass));
}
public override int GetHashCode()
{
int hashOfMyCollectionProp = 0;
// http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
// BUT... is it worth the extra math given that elem.GetHashCode() should be well-distributed?
int bitSpreader = 31;
foreach (var elem in MyCollectionProp)
{
hashOfMyCollectionProp = spreader * elem.GetHashCode();
bitSpreader *= 31;
}
return base.GetHashCode()^//^is a good combiner IF the combined values are well distributed
MyIntProp.GetHashCode()^
(MyStringProp == null ? 0 : MyStringProp.GetHashValue())^
(MyContainedClass == null ? 0 : MyContainedClass.GetHashValue())^
hashOfMyCollectionProp;
}
Mis preguntas
- es el sonido patrón de implementación?
- ¿Es adecuado dado que los valores de componentes contribuyentes están bien distribuidos? ¿Necesito multiplicar por 31-a-la-N cuando se combinan elementos de colección dado que su hash está bien distribuido?
- Parece que este código podría abstraerse en código que utiliza la reflexión para determinar propiedades públicas, crea un árbol de expresiones que coincida con la solución codificada a mano y ejecuta el árbol de expresiones según sea necesario. ¿Ese enfoque parece razonable? ¿Hay alguna implementación existente en alguna parte?
Por qué la downvote (más de un año después de la publicación)? La pregunta es muy legítima. Si hay algo mal con eso, por favor di qué. –