C#运算符==、StringBuilder.Equals、Object.Equals和Object.ReferenceEquals之间的差异

C#运算符==、StringBuilder.Equals、Object.Equals和Object.ReferenceEquals之间的差异,c#,object,stringbuilder,equals-operator,referenceequals,C#,Object,Stringbuilder,Equals Operator,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

我有一个关于
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不会覆盖,它会用另一个重载它


正在调用
等于(对象)
,因此结果为false。

您正在使用4种不同的比较方法,结果不同:

  • 默认情况下,操作员
    ==
    将检查引用是否相等。在本例中,您有两个实例,因此它们有两个不同的引用。
    =
    的行为可以被任何类型覆盖(如
    字符串
    有自己的比较方法),但对于
    字符串生成器
    则不是
  • 方法
    StringBuilder.Equals(StringBuilder)
    将与另一个StringBuilder进行比较,并比较一些内部值。在您的情况下,这些值是相同的。奇怪的是,
    StringBuilder
    没有覆盖方法
    StringBuilder.Equals(object)
    来应用相同的逻辑
  • 方法
    object.Equals(object,object)
    将尝试调用其中一个对象的方法
    .Equals(object)
    。在本例中:
    StringBuilder.Equals(object)
    ,正如我所说,它没有比较值的逻辑。结果只是比较了两个实例的引用
  • Object.ReferenceEquals
    将只比较引用
有关详细信息,请参阅:


StringBuilder.equals不比较对象,而是比较对象 发件人:

“如果此实例和sb具有相等的字符串容量,则为True, 和MaxCapacity值;否则为false。“


您正在执行的其余检查比较引用。

重载
等于
,而不覆盖它。他们怎么想的。就我个人而言,我会使用引用相等,但这个选择令人困惑。您应该解释和之间的区别,因为我们有两个不同的引用(对象、实例)和默认相等(对象)应该首先返回引用比较。@MatthewWatson-我不认为StringBuild实现了
IEquatable
:@Kobi-Yep,尽管它确实有与之匹配的东西。奇怪的是他们没有添加接口。也许这会是一个突破性的改变。你应该想出一个更好的问题标题。电流没有任何意义。请不要在标题中重复标记。@ReferenceEquals:您正在比较四种比较方法。我修改了你的标题以更好地反映你的问题。为什么你要检查2个StringBuilder的平等性?这就像检查流或textwriter是否相等。