Nếu tôi ghi đè Bằng và GetHashCode, làm cách nào để quyết định trường nào cần so sánh? Và điều gì sẽ xảy ra nếu tôi có hai đối tượng với hai trường mỗi, nhưng Equals chỉ kiểm tra một trường?Ghi đè bằng() nhưng không kiểm tra tất cả các trường - điều gì sẽ xảy ra?
Nói cách khác, chúng ta hãy nói rằng tôi có lớp học này:
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();
}
}
tôi xem xét hai đối tượng bình đẳng nếu họ có myid cùng. Vì vậy, nếu Id bằng nhau nhưng mô tả là khác nhau, chúng vẫn được coi là bằng nhau.
Tôi tự hỏi những cạm bẫy của phương pháp này là gì? Tất nhiên, một cấu trúc như thế này sẽ hoạt động như mong đợi:
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);
}
Vì eq2 có giá trị bằng eq1, nó sẽ không được thêm vào. Nhưng đó là mã mà tôi kiểm soát, nhưng tôi tự hỏi nếu có mã trong khuôn khổ có thể gây ra các vấn đề bất ngờ? Vì vậy, tôi nên luôn luôn thêm tất cả các lĩnh vực công cộng trong so sánh Equals() của tôi, hoặc các hướng dẫn để tránh một bất ngờ khó chịu vì một số Framework-Mojo xấu là hoàn toàn bất ngờ là gì?
đồng ý, giống như OP, tôi đã overidden Equals() để chỉ cần kiểm tra một ID chính, và thats nó, hoàn toàn của nó lập trình gọi. –