|
1
93
对于一个类,默认值本质上是引用相等,这通常很好。如果编写结构,更常见的是重写相等(不仅仅是为了避免装箱),但无论如何编写结构是非常罕见的!
重写相等时,应始终具有匹配的
对于生成哈希代码,通常使用因子和,因为这避免了成对值上的冲突-例如,对于基本的2字段哈希:
这样做的好处是:
etc-如果仅使用未加权和或xor,则这可能很常见(
|
|
|
2
89
InternalGetHashCode ObjectNative::GetHashCode
全面执行 GetHashCodex 相当大,因此只需链接到 the C++ source code . |
|
|
3
9
因为我找不到解释的答案
我们应该超越
我建议阅读整篇文章,但这里有一个总结(增加了重点和澄清)。 结构的默认哈希速度慢且不是很好的原因:
因此,要回答“在什么情况下我应该打包自己的,在什么情况下我可以安全地依赖默认实现”的问题,至少在
结构
班
你需要重写
|
|
|
4
7
|
|
|
5
2
一般来说,如果要重写Equals,则需要重写GetHashCode。这是因为两者都用于比较类/结构的相等性。
如果(A==B) 因为我们知道指针不太可能匹配,所以我们可以比较内部成员。
GetHashCode通常由哈希表使用。对于类的给定状态,类生成的哈希代码应该始终相同。
有人会说hashcode应该在每个对象生命周期中只计算一次,但我不同意这一点(我可能错了)。 使用object提供的默认实现,除非您对其中一个类具有相同的引用,否则它们将彼此不相等。通过重写Equals和GetHashCode,可以基于内部值而不是对象引用报告相等性。 |
|
|
6
0
如果您只是在处理POCO,您可以使用此实用程序简化您的生活:
|