繁体   English   中英

应该.GetHashCode()为内存中具有不同refences的两个对象返回相同的值吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM