为什么不直接在平等中使用GetHashCode?
这个问题在这里已经有了答案:
不保证两个不相等的对象具有不相等的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
或一个sbyte
或ushort
,但这是一个技术性)
如果你想要一个很好的例子,试着看一下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