我不同意其他答案。这个例子中的 Animal 不是一个值对象,两只猫可以具有相同的名称和颜色并且是完全不同的实体是完全可行的。从逻辑上讲,您是在说“这只猫和那只猫具有相同的名字和相同的颜色,因此它们是同一只猫”-这不一定是正确的..
我建议您将 Animal.Equals 保留为默认实现,并创建一个单独的 IEqualityComparer 实现,如果动物具有相同的名称/颜色,则返回 true。
public class AnimalNameColorComparer : IEqualityComparer<Animal>
{
public bool Equals(Animal a, Animal b)
{
return a.Name == b.Name &&
a.Color == b.Color
}
public int GetHashCode(Animal a)
{
return a.Name.GetHashCode() ^ a.Color.GetHashCode();
}
}
试着记住,比较一只猫有很多不同的方法,一个单一的“等于”方法是不够的:)
// Create two black cats called fluffy...
var cat1 = new Cat("Fluffy", "Black");
var cat2 = new Cat("Fluffy", "Black");
cat1.Equals(cat2) == false; // they are not the same cat!
var comparer = new AnimalNameColorComparer();
comparer.Equals(cat1, cat2) == true; // But they do have the same name & colour...