相等运算符

注意

此内容根据 Pearson Education, Inc. 许可转载自《框架设计指南:可重用 .NET 库的约定、习语和模式第二版》。 该版本于 2008 年出版,并在此后于第三版对该书进行了全面修订。 此页上的一些信息可能已过时。

本部分讨论重载相等运算符,并将 operator==operator!= 视为相等运算符。

❌ 请勿重载其中一个相等运算符而不重载另一个。

✔️ 请务必确保 Object.Equals 和相等运算符具有完全相同的语义和相似的性能特征。

这通常意味着在重载相等运算符时,需要重写 Object.Equals

❌ 请避免从相等运算符引发异常。

例如,如果其中一个参数为 null,则返回 false,而不是引发 NullReferenceException

针对值类型的相等运算符

✔️ 如果相等性是有意义的,请务必对值类型重载相等运算符。

在大多数编程语言中,值类型没有默认的 operator== 实现。

针对引用类型的相等运算符

❌ 请避免对可变引用类型重载相等运算符。

许多语言都具有用于引用类型的内置相等运算符。 内置运算符通常实现引用相等性,当默认行为更改为值相等性时,很多开发人员都感到很惊讶。

对于不可变的引用类型,此问题得到了缓解,因为不可变性使发现引用相等性和值相等性之间的差异变得更加困难。

❌ 请避免对引用类型重载相等运算符(如果实现的速度远远低于引用相等性的实现速度)。

Portions © 2005, 2009 Microsoft Corporation 版权所有。 保留所有权利。

在 Pearson Education, Inc. 授权下,由 Addison-Wesley Professional 作为 Microsoft Windows 开发系列的一部分再版自 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition(Framework 设计准则:可重用 .NET 库的约定、惯例和模式第 2 版),由 Krzysztof Cwalina 和 Brad Abrams 发布于 2008 年 10 月 22 日。

请参阅