10.了解GetHashCode()
1、对于引用类型,GetHashCode()函数返回当前对象的ID。(对象的ID在对象创建时自动分配)
2、对于值类型,GetHashCode()返回类型的第一个字段的散列值。
public struct MyStruct
{
private string _msg;
private int _id;
private DateTime _epoch;
}
从 MyStruct 对象上返回的散列值是从该对象的 _msg 成员上生成的。下面的代码片断总是返回 true
MyStruct s = new MyStruct( );
return s.GetHashCode( ) == s._msg.GetHashCode( );
概括一个默认的行为,Object.GetHashCode()可以正确的在引用类型上工作,尽管它不是必须保证一个高效
的分布 。 如果你有一个对 的 操作符的重载,你会破坏 。
( Object == GetHashCode()) ValueType.GetHashCode()
仅在你的结构的第一个字段是只读的时候才能正确工作。而当你的结构的第一个字段的值,复盖 了它所能
接受 的输入 的有意义的子集时,ValueType.GetHashCode()就可以保证一个高效的散列值
GetHashCode()具有很特殊的要求:相等的对象必须产生相等的散列值,并且散列值必须是对象不变的,并
且是均衡的高效分布 。所有这些只有对恒定类型才能满足 译注 :本文前面已经说过了, 框架中的
( .Net
其实并不满足均衡高效分布这一规则 。对于其它类型 ,就交给默认的行为
System.Object.GetHashCode() )
吧,知道它的缺点就行了。