我对这三个问题的理解是:
.Equals()测试数据相等(因为缺乏更好的描述)。.Equals()可以为同一对象的不同实例返回True,这是最常见的重写方法。.ReferenceEquals()测试两个对象是否是同一个实例,是否不能被重写。==与ReferenceEquals()相同,但可以重写它。但C#站指出:
在object类中,
Equals和ReferenceEquals方法在语义上是等价的,只不过ReferenceEquals只对对象实例起作用。ReferenceEquals方法是静态的。
现在我不明白了。有人能解释一下这件事吗?
发布于 2010-10-06 05:09:05
造成您困惑的原因似乎是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发布于 2010-10-06 05:06:26
在这个问题上看一看这篇MSDN文章。
我认为有关的要点是:
若要检查引用相等性,请使用ReferenceEquals。若要检查值相等,请使用“等于”或“等于”。 默认情况下,运算符==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现运算符==才能获得此功能。当一个类型是不可变的,这意味着不能更改实例中包含的数据,重载操作符==来比较值相等而不是引用相等是有用的,因为作为不可变对象,只要它们具有相同的值,它们就可以被认为是相同的。
希望这能有所帮助!
发布于 2010-10-06 05:06:12
你对.ReferenceEquals的理解是正确的。
.Equals检查值类型的数据相等,对非值类型(一般对象)检查引用相等。
可以重写.Equals以使对象执行某种形式的数据相等检查。
编辑:而且,.ReferenceEquals不能用于值类型(当然可以,但总是错误的)
https://stackoverflow.com/questions/3869601
复制相似问题