如果我重寫Equals和GetHashCode,我該如何決定要比較哪些字段?如果我有兩個對象,每個都有兩個字段,但Equals只檢查一個字段會發生什麼?重寫Equals()但不檢查所有字段 - 會發生什麼?
換句話說,假設我有這個類:
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();
}
}
我認爲兩個對象相等如果他們有相同的身份識別碼。所以如果Id相同但描述不同,它們仍然被認爲是平等的。
我只是想知道這種方法的缺陷是什麼?當然,像這樣的構造會像預期的那樣表現:
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);
}
由於等式2的值等於eq1,它不會被添加。但那是我控制的代碼,但我想知道框架中是否存在可能導致意外問題的代碼?
所以,我就應該總是添加所有公共領域在我的equals()方法的比較,或者是什麼,因爲一些不好的框架,那魔完全出乎意料的準則,以避免討厭的驚喜?
同意,如OP,我overidden equals()方法來只檢查一個主要的ID,這就是它,它完全是程序員所說的。 – 2009-03-04 02:23:19