为什么在重载相等运算符时需要重写 GetHashCode 和 Equals?

2024-02-01

无法覆盖GetHashCode and Equals当重载相等运算符导致编译器产生警告时。为什么改变两者的实现是一个好主意?看完之后Eric Lippert 关于 GetHashCode 的博客文章 http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx似乎 GetHashCode 的基本实现可能没有很多有用的替代方案,为什么编译器我鼓励您更改它?


假设您正在实现一个类。

如果您超载==那么你正在生成一个类型价值平等相对于参考平等。

鉴于此,现在的问题是“拥有一个实现引用相等的类有多可取”.Equals()和价值观平等==?”,答案是“不太理想”。这似乎是一个潜在的混乱来源。(事实上,我现在工作的公司 Coverity 生产了一个缺陷发现工具,可以检查您是否混淆了值正是因为这个原因,相等与引用相等。巧合的是,当我看到你的问题时,我正在阅读它的规范!)

此外,如果您要拥有一个同时实现值和引用相等的类,通常的方法是重写Equals然后离开==独自一人,而不是相反。

因此,鉴于您已经超载==,强烈建议您也覆盖Equals.

如果你是压倒性的Equals产生价值平等,那么你就是required覆盖GetHashCode匹配,如果你读过我链接到的文章,你就会知道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在重载相等运算符时需要重写 GetHashCode 和 Equals? 的相关文章

随机推荐