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进行比较,并比较一些内部值。在您的情况下,这些值是相同的。奇怪的是,StringBuilder.Equals(StringBuilder)
没有覆盖方法StringBuilder
来应用相同的逻辑StringBuilder.Equals(object)
- 方法
将尝试调用其中一个对象的方法object.Equals(object,object)
。在本例中:.Equals(object)
,正如我所说,它没有比较值的逻辑。结果只是比较了两个实例的引用StringBuilder.Equals(object)
将只比较引用Object.ReferenceEquals
您正在执行的其余检查比较引用。重载
等于
,而不覆盖它。他们怎么想的。就我个人而言,我会使用引用相等,但这个选择令人困惑。您应该解释和之间的区别,因为我们有两个不同的引用(对象、实例)和默认相等(对象)应该首先返回引用比较。@MatthewWatson-我不认为StringBuild实现了IEquatable
:@Kobi-Yep,尽管它确实有与之匹配的东西。奇怪的是他们没有添加接口。也许这会是一个突破性的改变。你应该想出一个更好的问题标题。电流没有任何意义。请不要在标题中重复标记。@ReferenceEquals:您正在比较四种比较方法。我修改了你的标题以更好地反映你的问题。为什么你要检查2个StringBuilder的平等性?这就像检查流或textwriter是否相等。