Wenn ich Equals und GetHashCode überschreibe, wie kann ich entscheiden, welche Felder verglichen werden sollen? Und was passiert, wenn ich zwei Objekte mit jeweils zwei Feldern habe, aber Equals nur ein Feld überprüft?Überschreiben Gleich(), aber nicht alle Felder prüfen - was wird passieren?
Mit anderen Worten, lassen Sie uns sagen, dass ich diese Klasse haben:
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();
}
}
ich zwei Objekte gleich prüfen, ob sie die gleiche myid haben. Wenn also die Id gleich ist, aber die Beschreibung unterschiedlich ist, werden sie immer noch als gleich angesehen.
Ich frage mich nur, was die Fallen dieses Ansatzes sind? Natürlich verhält sich erwartet ein Konstrukt, wie dies zum Beispiel:
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);
}
Als EQ2 auf EQ1 wert gleich ist, wird er nicht hinzugefügt werden. Aber das ist Code, den ich kontrolliere, aber ich frage mich, ob es Code im Framework gibt, der unerwartete Probleme verursachen könnte?
Also, sollte ich immer alle öffentlichen Felder in meinem Equals() Vergleich hinzufügen, oder was sind die Richtlinien, um eine böse Überraschung wegen einiger schlechter Framework-Mojo zu vermeiden, die völlig unerwartet war?
vereinbart, wie die OP, ich habe außer Kraft gesetzt Equals(), um nur zu überprüfen eine primäre ID, und das ist es, es ist völlig die Programmierer rufen. –