operator ==、StringBuilder的区别.等于,对象.Equals和Object.ReferenceEq

本文关键字:Equals 对象 Object ReferenceEq 等于 StringBuilder 区别 operator | 更新日期: 2023-09-27 18:12:15

我有一个关于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),所以为什么它给出两个不同的结果?

operator ==、StringBuilder的区别.等于,对象.Equals和Object.ReferenceEq

您错过了另一个测试:

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)。在这种情况下:StringBuilder.Equals(object),正如我所说,没有逻辑来比较值。结果只是比较两个实例的引用。
  • Object.ReferenceEquals将只比较引用。

有关更多信息,请参见:

  • http://msdn.microsoft.com/en-us/library/f37cfeys.aspx
  • http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx
  • http://msdn.microsoft.com/en-us/library/system.object.referenceequals.aspx

StringBuilder。Equals不比较对象,而是从MSDN:

"如果此实例和sb具有相等的string容量,则为True,和MaxCapacity值;否则,假的。"

您正在做的其余检查比较引用