gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:41:02 26 4
gpt4 key购买 nike

我对这三者的理解是:

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

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

  • == 默认情况下与 ReferenceEquals() 相同,但可以覆盖它。

但是C# station状态:

In the object class, the Equals and ReferenceEquals methods are semantically equivalent, except that the ReferenceEquals works only on object instances. The ReferenceEquals method is static.

现在我不明白了。任何人都可以阐明这一点吗?

最佳答案

您混淆的根源似乎是 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

关于C# .Equals()、.ReferenceEquals() 和 == 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com