我需要为我的一个类型重写Equals()方法,但似乎我必须覆盖GetHashCode()方法。
我不确定:
如果我有动物类型,如果我有2个动物实例基本相同(等于)猫;像:
Animal cat_01 = new Animal("Kitty", "Pink");
Animal cat_02 = new Animal("Kitty", "Pink");
我是否应该实现GetHashedCode()来为cas_01和cat_02重新定义相同的值,尽管它们代表内存中的不同引用?
这是GetHashCode()shuold工作的方式吗?
由于
答案 0 :(得分:4)
如果两个对象比较相等,则每个对象的GetHashCode方法 对象必须返回相同的值。
所以是的,GetHashCode应该为两个实例返回相同的值。
如果你想看看它们是否引用同一个对象,你仍然可以使用Object.ReferenceEquals。
答案 1 :(得分:3)
我不同意其他答案。在这个例子中,动物不是一个有价值的对象,两只猫可能具有相同的名称是完全可行的。颜色和完全不同的实体。从逻辑上讲,你说“这只猫和那只猫有相同的名字和相同的颜色,因此它们是同一只猫” - 这不一定是真的..
我建议您将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...
答案 2 :(得分:1)
根据模型的设计,如果它是值对象(不可变),则gethashcode应返回所有字段的散列值,但另一方面,如果它是域实体,则它应具有标识和这个身份应该用于比较和gethashcode(两个名字和年龄相同的人不一样,如果你有两只同名的猫并不意味着它们是同一只猫!)。
检查:http://moh-abed.com/2011/07/13/entities-and-value-objects/