C#.Equals(),.ReferenceEquals()和==运算符
我对这三个人的理解是:
.Equals()
测试数据是否相等(缺少更好的描述)。 .Equals()
可以为同一对象的不同实例返回True,这是最常用的重写方法。
.ReferenceEquals()
测试两个对象是否是相同的实例并且不能被覆盖。
==
默认情况下与ReferenceEquals()
相同,但这可以被覆盖。
但C#站点状态:
在对象类中, Equals
和ReferenceEquals
方法在语义上是等价的,只不过ReferenceEquals
只适用于对象实例。 ReferenceEquals
方法是静态的。
现在我不明白。 任何人都可以对此有所了解吗?
混淆的根源似乎是C#工作站提取的拼写错误,它应该是:“......除了Equals仅用于对象实例,ReferenceEquals方法是静态的。”
你对每个语义的差异都是松散的(虽然“同一个对象的不同实例”似乎有点混淆,它应该可能读为“同一类型的不同实例”),而且关于哪个可以被覆盖。
如果我们把它放在一边,让我们来处理你的问题的最后一点,即它们如何处理普通的System.Object
实例和System.Object
引用(我们需要避免==
的非多态性)。 在这里,所有三个操作都可以等效,但有一点需要注意: Equals
不能在null
上调用。
Equals
是一个实例方法,它接受一个参数(可以为null
)。 由于它是一个实例方法(必须在实际对象上调用),因此无法在null
引用上调用它。
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
看看这个关于这个主题的MSDN文章。
我认为有关的观点是:
要检查引用相等性,请使用ReferenceEquals。 要检查值是否相等,请使用Equals或Equals。
默认情况下,运算符==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能。 当一个类型是不可变的,意味着包含在实例中的数据不能被改变,重载operator ==比较值相等性而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有相同的价值。
希望这可以帮助!
您对.ReferenceEquals的理解是正确的。
.Equals检查值类型的数据相等性,以及非值类型(一般对象)的引用相等性。
。对象可以被覆盖以执行某种形式的数据相等性检查
编辑:此外,.ReferenceEquals不能用于值类型(它可以,但将永远是假的)
链接地址: http://www.djcxy.com/p/58485.html