18 .net c# dictionary gethashcode
我在StackOverflow上阅读了大部分关于的问题GetHashCode.但我仍然不确定是否必须覆盖GetHashCode引用类型.我从另一个问题的某些人那里得到了以下答案:
Object.GetHashCode()使用System.Object类中的内部字段来生成哈希值.创建时,为每个创建的对象分配一个唯一的对象键,存储为整数.这些键从1开始,每次创建任何类型的新对象时都会递增.
如果在.NET Framework 3.5中仍然如此(有人可以确认吗?),那么我在参考类型的默认实现中看到的唯一问题是哈希代码的分布很差.
我会打破我的问题:
a)所以建议覆盖GetHashCode它是否在a中使用Dictionary或者默认实现是否正常?
b)我有很容易做的引用类型,因为它们具有唯一标识它们的字段,但是那些所有成员也是引用类型的引用类型呢.我该怎么办?
Ree*_*sey 17
如果重写Object.Equals(),则只需要在引用类型上覆盖GetHashCode().
原因很简单 - 通常,2个引用总是不同的(a.Equals(b)== false,除非它们是同一个对象).在这种情况下,GetHashCode()的默认实现将提供2个不同的哈希值,因此一切都很好.
但是,如果重写Equals(),则无法保证此行为.如果两个对象相等(根据Equals()),则需要保证它们与GetHashCode具有相同的哈希码,因此您应该覆盖它.
| 归档时间: |
|
| 查看次数: |
2855 次 |
| 最近记录: |