我正在开发一个 C# 项目,到目前为止,我已经使用不可变对象和工厂来确保类型的对象Foo
总是可以比较是否相等==
.
Foo
对象一旦创建就无法更改,并且工厂始终为给定的参数集返回相同的对象。这非常有效,并且在整个代码库中我们假设==
始终致力于检查相等性。
现在我需要添加一些功能,引入一些边缘情况,但这种情况并不总是有效。最简单的事情就是超载operator ==
对于该类型,这样项目中的其他代码就不需要更改。但这让我觉得有一种代码味道:重载operator ==
并不是Equals
只是看起来很奇怪,我已经习惯了这样的惯例==
检查引用相等性,以及Equals
检查对象相等性(或无论术语是什么)。
这是一个合理的担忧,还是我应该继续超载operator ==
?
之间有很大的区别超载 ==
and 压倒性的 Equals.
当你有这样的表情时
if (x == y) {
用于比较变量 x 和 y 的方法由以下决定:compile时间。这就是运算符重载。声明 x 和 y 时使用的类型用于定义使用哪种方法来比较它们。 x 和 y 中的实际类型(即子类或接口实现)是不相关的。考虑以下。
object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
if (x == y) { // evaluates to FALSE
以及以下内容
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
if (x == y) { // evaluates to TRUE
这表明用于声明变量 x 和 y 的类型用于确定使用哪种方法来计算 ==。
通过比较,Equals 确定为runtime基于变量 x 中的实际类型。 Equals 是 Object 上的虚拟方法,其他类型可以并且确实可以重写该方法。因此,以下两个示例均评估为 true。
object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
if (x.Equals(y)) { // evaluates to TRUE
以及以下内容
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
if (x.Equals(y)) { // also evaluates to TRUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)