簡體   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