Si anulo Equals y GetHashCode, ¿cómo decido qué campos comparar? ¿Y qué pasará si tengo dos objetos con dos campos cada uno, pero Equals solo comprueba un campo?Ignorar Igual() pero no verificar todos los campos, ¿qué pasará?
En otras palabras, vamos a decir que tengo esta clase:
class EqualsTestClass
{
public string MyDescription { get; set; }
public int MyId { get; set; }
public override bool Equals(object obj)
{
EqualsTestClass eq = obj as EqualsTestClass;
if(eq == null) {
return false;
} else {
return MyId.Equals(eq.MyId);
}
}
public override int GetHashCode()
{
int hashcode = 23;
return (hashcode * 17) + MyId.GetHashCode();
}
}
que considerar dos objetos iguales si tienen el mismo MyID. Entonces, si el Id es igual pero la descripción es diferente, aún se consideran iguales.
Me pregunto cuáles son los peligros de este enfoque. Por supuesto, se comporta como se esperaba una construcción como esta:
List<EqualsTestClass> test = new List<EqualsTestClass>();
EqualsTestClass eq1 = new EqualsTestClass();
eq1.MyId = 1;
eq1.MyDescription = "Des1";
EqualsTestClass eq2 = new EqualsTestClass();
eq2.MyId = 1;
eq2.MyDescription = "Des2";
test.Add(eq1);
if (!test.Contains(eq2))
{
// Will not be executed, as test.Contains is true
test.Add(eq2);
}
Como EQ2 es de valor igual a eq1, no va a ser añadido. Pero ese es el código que yo controlo, pero me pregunto si hay un código en el marco que pueda causar problemas inesperados.
Entonces, ¿debería siempre agregar todos los campos públicos en mi comparación de Equals(), o cuáles son las pautas para evitar una desagradable sorpresa debido a un mal Framework-Mojo que fue completamente inesperado?
de acuerdo, al igual que el PO, he alterada temporalmente equals() simplemente comprobar una identificación primaria, y eso es todo lo que llaman los programadores. –