【发布时间】:2010-08-23 11:05:23
【问题描述】:
如何根据对象的身份为其生成哈希码。
我的意思是:
- 如果
object.ReferenceEquals(a, b) == true,那么a和b将获得相同的哈希码。 - 如果
object.ReferenceEquals(a, b) == false,那么a和b应该有不错的机会获得不同的哈希码,即使它们在成员上是相等的。
我拥有的是:
class SomeClassThatMakesSenseToCompareByReferenceAndByValue {
override Equals(object o) {
return MemberwiseEquals(o);
}
override GetHashCode() {
return MemberwiseGetHashCode();
}
}
class SomeClassThatNeedsReferenceComparison {
SomeClassThatMakesSenseToCompareByReferenceAndByValue obj;
override Equals(object o) {
return o is SomeClassThatNeedsReferenceComparison && object.ReferenceEquals(this.obj, (o as SomeClassThatNeedsReferenceComparison).obj);
}
override GetHashCode() {
return ?????
}
}
【问题讨论】:
-
这可能有助于更详细地解释您的用例。
-
"[...] 得到不同的哈希码,即使它们在成员上是相等的" - 这听起来有点奇怪。考虑
GetHashCode文档中的以下文本(在“实现者须知”下):“如果两个对象比较相等,则每个对象的 GetHashCode 方法必须返回相同的值”。不过我可能会错过一些东西。 -
这就是我的
SomeClassThatMakesSenseToCompareByReferenceAndByValue类返回一致哈希码的原因。但在我的另一堂课中,我想根据身份使用GetHashCodeANDEquals。