C#.Equals()、. ReferenceEquals()和==运算符
我对这三个方面的理解是:
.Equals()
测试数据是否相等(缺少更好的描述)。.Equals()
可以为同一对象的不同实例返回True,这是最常用的方法。.ReferenceEquals()
测试两个对象是否是同一实例,并且不能被覆盖。==
与ReferenceEquals()
默认情况下的相同,但是可以覆盖此设置。
但是C#站指出:
在对象类中,
Equals
和
ReferenceEquals
方法在语义上是等效的,只不过该方法ReferenceEquals
仅适用于对象实例。该
ReferenceEquals
方法是静态的。
现在我不明白。谁能对此有所启发?
回答:
造成混淆的原因似乎是C#站的摘录中有一个错字,该错字应为:“ …,但
仅适用于对象实例。ReferenceEquals方法是静态的。”
您对每个语义含义的差异大体上是正确的(尽管“同一对象的不同实例”似乎有些混乱,但它可能应该读为“同一 类型的 不同实例” ),并且可以对其进行覆盖。
如果我们将其放在一边,让我们处理您的问题的最后一部分,即它们如何与普通System.Object
实例和System.Object
引用一起使用(我们都需要规避的非多态性质==
)。在此,所有这三个操作将
等效地 工作,但有一个警告:Equals
无法在上调用null
。
Equals
是采用 一个 参数( 可以
是null
)的实例方法。由于它是一个实例方法(必须在实际对象上调用),因此不能在null
-reference 上调用。
ReferenceEquals
是一个采用 两个 参数的静态方法,其中 两个 参数都可以是null
。由于它是静态的(不与对象 实例
相关联),因此NullReferenceException
在任何情况下都不会抛出。
==
是运算符,在这种情况下(object
)的行为与相同ReferenceEquals
。它也不会抛出NullReferenceException
。
为了显示:
object o1 = null;object o2 = new object();
//Technically, these should read object.ReferenceEquals for clarity, but this is redundant.
ReferenceEquals(o1, o1); //true
ReferenceEquals(o1, o2); //false
ReferenceEquals(o2, o1); //false
ReferenceEquals(o2, o2); //true
o1.Equals(o1); //NullReferenceException
o1.Equals(o2); //NullReferenceException
o2.Equals(o1); //false
o2.Equals(o2); //true
以上是 C#.Equals()、. ReferenceEquals()和==运算符 的全部内容, 来源链接: utcz.com/qa/399700.html