我对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)
时,为什么它会给出两个不同的结果?
答案 0 :(得分:17)
您错过了另一项测试:
Console.WriteLine(sb1.Equals((object)sb2)); // False!
StringBuilder不会覆盖Equals(object)
,重载与另一个Equals(StringBuilder)
。
Object.Equals(object, object)
正在调用Equals(object)
,因此结果为false。
答案 1 :(得分:4)
您正在使用4种不同的比较方法,结果会有不同的结果:
==
会检查引用是否相等。在这种情况下,您有两个实例,因此它们有两个不同的引用。 ==
的行为可以被任何类型覆盖(例如string
都有自己的比较方法),但是StringBuilder
则不是。StringBuilder.Equals(StringBuilder)
将与另一个StringBuilder进行比较并比较一些内部值。在您的情况下,这些值是相同的。奇怪的是,StringBuilder
不会覆盖方法StringBuilder.Equals(object)
以应用相同的逻辑。object.Equals(object, object)
将尝试调用其中一个对象的方法.Equals(object)
。在这种情况下:StringBuilder.Equals(object)
,正如我所说,没有比较值的逻辑。导致只比较两个实例的引用。Object.ReferenceEquals
只会比较参考文献。有关详细信息,请参阅:
答案 2 :(得分:3)
StringBuilder.equals不比较对象而是比较 来自MSDN:
“如果此实例和某人具有相同的字符串,容量,则为真, 和 MaxCapacity 值;否则,是的。“
您正在进行的其他检查会比较参考。