![](/img/trans.png)
[英]difference between Object.Equals(object,object) and Object.ReferenceEquals(object,object) in c#
[英]C# Differences between operator ==, StringBuilder.Equals, Object.Equals and Object.ReferenceEquals
我有一个关于Object.Equals
和Equals(object)
。 我的示例代码如下:
class Program
{
static void Main(string[] args)
{
var sb1 = new StringBuilder("Food");
var sb2 = new StringBuilder("Food");
Console.WriteLine(sb1 == sb2);
Console.WriteLine(sb1.Equals(sb2));
Console.WriteLine(Object.Equals(sb1, sb2));
Console.WriteLine(Object.ReferenceEquals(sb1, sb2));
Console.ReadLine();
}
}
输出是:
False
True
False
False
但就我而言, Object.Equals(sb1, sb2)
内部调用sb1.Equals(sb2)
,为什么它会给出两个不同的结果呢?
你错过了另一个测试:
Console.WriteLine(sb1.Equals((object)sb2)); // False!
StringBuilder不会覆盖Equals(object)
,它会使用另一个Equals(StringBuilder)
重载它。
Object.Equals(object, object)
正在调用Equals(object)
,因此结果为false。
您正在使用4种不同的比较方法,导致不同的结果:
==
会检查引用是否相等。 在这种情况下,您有两个实例,因此它们有两个不同的引用。 ==
的行为可以被任何类型覆盖(比如string
有自己的比较方法),但是在StringBuilder
情况下它不是。 StringBuilder.Equals(StringBuilder)
将与另一个StringBuilder进行比较并比较一些内部值。 在您的情况下,这些值是相同的。 奇怪的是, StringBuilder
不会覆盖方法StringBuilder.Equals(object)
来应用相同的逻辑。 object.Equals(object, object)
将尝试调用其中一个.Equals(object)
的方法.Equals(object)
。 在这种情况下: StringBuilder.Equals(object)
,正如我所说,它没有比较值的逻辑。 导致只比较两个实例的引用。 Object.ReferenceEquals
将只比较引用。 有关详细信息,请参阅:
StringBuilder.equals不会比较对象,而是来自MSDN :
“如果此实例和sb具有相等的字符串 , 容量和MaxCapacity值, 则为True ;否则为false。”
您正在进行的其他检查会比较参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.