21

伙计们,这是一个棘手的问题!

TickZoom 系统的一部分必须将每种类型的对象的实例收集到 Dictionary<> 类型中。

它们的相等性和哈希码必须基于对象的实例,这意味着引用相等而不是值相等。挑战在于系统中的某些对象已覆盖 Equals() 和 GetHashCode() 以用作值相等,并且它们的内部值会随着时间而改变。这意味着它们的 Equals 和 GetHashCode 是无用的。如何一般而不是侵入性地解决这个问题?

到目前为止,我们创建了一个结构来包装每个名为 ObjectHandle 的对象,以便散列到 Dictionary 中。正如你在下面看到的,我们实现了 Equals() 但如何计算哈希码的问题仍然存在。

public struct ObjectHandle : IEquatable<ObjectHandle>{
    public object Object;
    public bool Equals(ObjectHandle other) {
        return object.ReferenceEquals(this.Object,other.Object);
    }
}

看?有方法 object.ReferenceEquals() 将比较引用相等性,而不考虑对象中任何重写的 Equals() 实现。

现在,如何只考虑引用而不考虑任何覆盖的 GetHashCode() 方法来计算匹配的 GetHashCode()?

啊,我希望这能给你一个有趣的谜题。我们被困在这里。

真诚的,韦恩

4

3 回答 3

25

RuntimeHelpers.GetHashCode()正是这里所需要的。

于 2010-05-31T17:44:34.603 回答
2

您正在打破模式,这会导致无法解决的问题。方法Equals应该比较对象的内容,而不是比较引用。这就是object.Equals为什么,为什么用相同的行为覆盖?

现在关于GetHashCode. 同样,哈希码是应用于对象内容的哈希函数。您不能仅通过参考来计算它。您可以使用指向对象的指针并将其用作哈希,但在 .net 中,对象的地址可以通过 GC 更改。

于 2010-05-31T16:37:26.390 回答
0

哈希码不必是唯一的。(但唯一性会提高性能)。
所以 - 你可以做的一件事是通过类型名称设置哈希码。同一类型的所有对象都将具有相同的哈希码。

于 2010-05-31T16:33:30.317 回答