operator ==、StringBuilder的区别.等于,对象.Equals和Object.ReferenceEq
本文关键字:Equals 对象 Object ReferenceEq 等于 StringBuilder 区别 operator | 更新日期: 2023-09-27 18:12:15
我有一个关于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不覆盖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值;否则,假的。"
您正在做的其余检查比较引用