Se eseguo l'override di Equals e GetHashCode, come faccio a decidere quali campi confrontare? E cosa succederà se avrò due oggetti con due campi ciascuno, ma Equals controlla solo un campo?Overriding Equals() ma non controlla tutti i campi - cosa accadrà?
In altre parole, diciamo che ho questa classe:
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();
}
}
considero due oggetti uguali se hanno lo stesso myid. Quindi se l'Id è uguale ma la descrizione è diversa, sono comunque considerate uguali.
Mi chiedo quali sono le insidie di questo approccio? Naturalmente, un costrutto come questo si comporterà come previsto:
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);
}
Come eq2 è valore pari a EQ1, non sarà aggiunto. Ma questo è il codice che controllo, ma mi chiedo se nel framework ci sia del codice che potrebbe causare problemi imprevisti?
Quindi, dovrei sempre aggiungere tutti i campi pubblici nel mio confronto Equals(), o quali sono le linee guida per evitare una brutta sorpresa a causa di un pessimo framework Mojo che era completamente inaspettato?
concordato, come il PO, ho overidden Equals() per controllare solo un ID primario, e questo è tutto, è totalmente la chiamata dei programmatori. –