首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# .Equals()、.ReferenceEquals()和==算子

C# .Equals()、.ReferenceEquals()和==算子
EN

Stack Overflow用户
提问于 2010-10-06 05:02:35
回答 6查看 74.7K关注 0票数 96

我对这三个问题的理解是:

  • .Equals()测试数据相等(因为缺乏更好的描述)。.Equals()可以为同一对象的不同实例返回True,这是最常见的重写方法。
  • .ReferenceEquals()测试两个对象是否是同一个实例,是否不能被重写。
  • 默认情况下,==ReferenceEquals()相同,但可以重写它。

C#站指出:

在object类中,EqualsReferenceEquals方法在语义上是等价的,只不过ReferenceEquals只对对象实例起作用。ReferenceEquals方法是静态的。

现在我不明白了。有人能解释一下这件事吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-06 05:09:05

造成您困惑的原因似乎是C#站点的摘录中有一个错误,应该是:“.但是等于只在对象实例上工作。ReferenceEquals方法是静态的。”

您对每个对象的语义含义的差异大致是正确的(虽然“同一对象的不同实例”似乎有点混乱,但它可能应该读到“相同类型的不同实例”),关于这些实例可以重写。

如果不考虑这一点,那么让我们来讨论您问题的最后一点,即它们如何处理普通的System.Object实例和System.Object引用(我们都需要避免==的非多态性质)。在这里,所有三个操作都可以等效地工作,但请注意:Equals不能在null上调用。

Equals是一个实例方法,它接受一个参数(可以是null)。由于它是一个实例方法(必须在实际对象上调用),所以不能在null-reference上调用它。

ReferenceEquals是一个静态方法,它接受两个参数,其中一个/两个参数都可以是null。由于它是静态的(不与对象实例相关联),因此在任何情况下都不会抛出NullReferenceException

==是一个运算符,在本例中(object),它的行为与ReferenceEquals相同。它也不会抛出一个NullReferenceException

为了说明:

代码语言:javascript
复制
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
票数 101
EN

Stack Overflow用户

发布于 2010-10-06 05:06:26

在这个问题上看一看这篇MSDN文章

我认为有关的要点是:

若要检查引用相等性,请使用ReferenceEquals。若要检查值相等,请使用“等于”或“等于”。 默认情况下,运算符==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现运算符==才能获得此功能。当一个类型是不可变的,这意味着不能更改实例中包含的数据,重载操作符==来比较值相等而不是引用相等是有用的,因为作为不可变对象,只要它们具有相同的值,它们就可以被认为是相同的。

希望这能有所帮助!

票数 26
EN

Stack Overflow用户

发布于 2010-10-06 05:06:12

你对.ReferenceEquals的理解是正确的。

.Equals检查值类型的数据相等,对非值类型(一般对象)检查引用相等。

可以重写.Equals以使对象执行某种形式的数据相等检查。

编辑:而且,.ReferenceEquals不能用于值类型(当然可以,但总是错误的)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3869601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档