我对这三个的理解是:
.Equals()
测试数据平等(缺乏更好的描述)..Equals()
可以为同一对象的不同实例返回True,这是最常被覆盖的方法.
.ReferenceEquals()
测试两个对象是否是同一个实例,并且不能被覆盖.
==
ReferenceEquals()
默认情况下与此相同,但可以覆盖此项.
但C#站说:
在对象类中,
Equals
和ReferenceEquals
方法在语义上是等效的,除了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)
Ala*_*tts 18
我认为相关的观点是:
要检查引用相等性,请使用ReferenceEquals.要检查值的相等性,请使用"等于"或"等于".
默认情况下,operator ==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能.当一个类型是不可变的,意味着实例中包含的数据不能被改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有它们,它们就可以被认为是相同的相同的价值.
希望这可以帮助!
您对.ReferenceEquals的理解是正确的.
.Equals检查值类型的数据相等性,以及非值类型(常规对象)的引用相等性.
.Equals可以被覆盖,以便对象执行某种形式的数据相等性检查
编辑:另外,.ReferenceEquals不能用于值类型(它可以,但总是假的)
归档时间: |
|
查看次数: |
53139 次 |
最近记录: |