为什么不直接在平等中使用GetHashCode?

这个问题在这里已经有了答案:

  • 使用GetHashCode测试Equals中的等式会覆盖8个答案

  • 不保证两个不相等的对象具有相等的hashcode(这就是所谓的冲突)。这就是MSDN所说的:

    如果两个对象的比较相等,则每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较结果不相等,则两个对象的GetHashCode方法不必返回不同的值。


    这是因为有更多的可能性比hashcodes。

    例如,让我们带你的班级。

    已经有问题了,因为年龄范围与int范围相同。 当然,这可以被消除:只需要使用一个byte 。 不过,我们遇到了一个问题:字符串。 .NET字符串是Unicode(UTF-16),因此每个字母有65,536个可能的字符。 之后,它会迅速升级......两个字符的字符串最多可以有65,536 ^ 2个字符,即4,294,967,296( uint.MaxValue )个可能性。 这是一大堆,这只是两个字符。

    td; lr :你不能保证两个不相等的对象不会有相同的散列码。 完全一样。 (除非它是一个byte或一个short或一个sbyteushort ,但这是一个技术性)


    如果你想要一个很好的例子,试着看一下Resharper的一面。

    public class Person : IEquatable<Person>
    {
        public string Name { get; set; }
        public int Age { get; set; }
    
        public bool Equals(Person other)
        {
            if (ReferenceEquals(null, other)) return false;
            if (ReferenceEquals(this, other)) return true;
            return string.Equals(Name, other.Name) && Age == other.Age;
        }
    
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != this.GetType()) return false;
            return Equals((Person) obj);
        }
    
        public override int GetHashCode()
        {
            unchecked
            {
                return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Age;
            }
        }
    }
    
    链接地址: http://www.djcxy.com/p/39787.html

    上一篇: why not just using GetHashCode in Equality?

    下一篇: Inconsistency in Equals and GetHashCode methods