C#.Equals(),. ReferenceEquals()和==运算符

999*_*999 76 c# equality

我对这三个的理解是:

  • .Equals()测试数据平等(缺乏更好的描述)..Equals()可以为同一对象的不同实例返回True,这是最常被覆盖的方法.

  • .ReferenceEquals() 测试两个对象是否是同一个实例,并且不能被覆盖.

  • ==ReferenceEquals()默认情况下与此相同,但可以覆盖此项.

C#站说:

在对象类中,EqualsReferenceEquals方法在语义上是等效的,除了ReferenceEquals它只在对象实例上有效.该 ReferenceEquals方法是静态的.

现在我没理解.任何人都可以对此有所了解吗?

Ani*_*Ani 78

您混淆的原因似乎是C#工作站的摘录中有一个拼写错误,其中应该是:"......除了Equals仅适用于对象实例.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
Run Code Online (Sandbox Code Playgroud)

  • 我的回答是*仅*关于“object”类。 (2认同)
  • “等于”也是对“对象”的静态方法,该方法带有两个参数。一个或两个都可以为“ null”。 (2认同)

Ala*_*tts 18

看看这篇关于这个主题的MSDN文章.

我认为相关的观点是:

要检查引用相等性,请使用ReferenceEquals.要检查值的相等性,请使用"等于"或"等于".

默认情况下,operator ==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能.当一个类型是不可变的,意味着实例中包含的数据不能被改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有它们,它们就可以被认为是相同的相同的价值.

希望这可以帮助!

  • 不幸的是,链接已死。+1用于复制相关信息。 (2认同)

Luk*_*fer 6

您对.ReferenceEquals的理解是正确的.

.Equals检查值类型的数据相等性,以及非值类型(常规对象)的引用相等性.

.Equals可以被覆盖,以便对象执行某种形式的数据相等性检查

编辑:另外,.ReferenceEquals不能用于值类型(它可以,但总是假的)