繁体   English   中英

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

[英]C# Differences between operator ==, StringBuilder.Equals, Object.Equals and Object.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) ,为什么它会给出两个不同的结果呢?

你错过了另一个测试:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM