[英]Should .GetHashCode() return same value for two objects having different refences in the memory?
我需要为我的一个类型重写Equals()方法,但似乎我必须重写GetHashCode()方法。
我不确定:
如果我有动物类型,如果我有2个动物实例基本相同(相同)猫; 喜欢:
Animal cat_01 = new Animal("Kitty", "Pink");
Animal cat_02 = new Animal("Kitty", "Pink");
我应该实现GetHashedCode()来为cas_01和cat_02重新定义相同的值,尽管它们代表内存中的不同引用吗?
这是GetHashCode()shuold工作的方式吗?
谢谢
MSDN说 :
如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。
所以是的,GetHashCode应该为两个实例返回相同的值。
如果要查看它们是否引用同一对象,您仍然可以使用Object.ReferenceEquals。
我不同意其他答案。本例中的动物不是一个价值对象,两只猫可以拥有相同的名称和颜色,完全不同的实体是完全可行的。 从逻辑上讲,你说“这只猫和那只猫有相同的名字和相同的颜色,因此它们是同一只猫” - 这不一定是真的..
我建议你做的是将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...
根据模型的设计,如果它是值对象(不可变),则gethashcode应返回所有字段的散列值,但另一方面,如果它是域实体,则它应该具有标识,并且此标识应该用于比较和gethashcode(两个具有相同名称和年龄的人不一样,如果你有两只同名的猫并不意味着它们是同一只猫!)。
检查: http : //moh-abed.com/2011/07/13/entities-and-value-objects/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.