![](/img/trans.png)
[英]difference between Object.Equals(object,object) and Object.ReferenceEquals(object,object) in c#
[英]C# Differences between operator ==, StringBuilder.Equals, Object.Equals and Object.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.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.