C#operator ==,StringBuilder.Equals,Object.Equals和Object.ReferenceEquals之间的差异

时间:2013-05-05 09:08:01

标签: c# object stringbuilder equals-operator referenceequals

我对Object.EqualsEquals(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)时,为什么它会给出两个不同的结果?

3 个答案:

答案 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 值;否则,是的。“

您正在进行的其他检查会比较参考。