2013-05-05 52 views
26

之間的差異我有一個關於Object.EqualsEquals(object)的問題。我的樣本代碼如下:C#運營商==,StringBuilder.Equals,Object.Equals和Object.ReferenceEquals

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)爲何還給出了兩個不同的結果?

+0

你應該想出一個更好的問題標題。目前沒有任何意義。請不要在標題中重複標籤。 – 2013-05-05 09:20:49

+0

@ReferenceEquals:你比較了四種比較方法。我修改了你的標題以更好地反映你的問題。 – 2013-05-05 09:36:42

+3

你爲什麼要檢查2個stringbuilders上的等號?這就像檢查一個流或者textwriter的平等。 – leppie 2013-05-05 09:57:32

回答

17

你缺少另一個測試:

Console.WriteLine(sb1.Equals((object)sb2)); // False! 

的StringBuilder不會覆蓋Equals(object),它重載與另一個Equals(StringBuilder)

Object.Equals(object, object)打電話給Equals(object),所以結果是錯誤的。

+0

重寫'Equals'而不重寫它。跆拳道他們是否認爲。就個人而言,我會用參考平等,但這種選擇只是混淆。 – CodesInChaos 2013-05-05 09:18:26

+1

您應該解釋['Object.Equals()'](http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx)和['IEquatable '](http:// msdn.microsoft.com/en-us/library/ms131187.aspx) – 2013-05-05 09:20:32

+0

因爲我們有兩個不同的引用(對象,實例),並且默認的Equal(對象)應該首先返回引用比較。 – Uzzy 2013-05-05 09:22:17

4

您正在使用4種不同的比較方法,會導致不同的結果:

  • 操作==會默認做一次檢查,如果引用是相等的。在這種情況下,你有兩個實例,所以它們有兩個不同的引用。 ==的行爲可以被任何類型覆蓋(例如string有其自己的比較方法),但在StringBuilder的情況下則不是。
  • 方法StringBuilder.Equals(StringBuilder)將與另一個StringBuilder比較並比較一些內部值。在你的情況下,這些值是相同的。奇怪的是StringBuilder不會覆蓋方法StringBuilder.Equals(object)來應用相同的邏輯。
  • 方法object.Equals(object, object)將嘗試調用其中一個對象的方法.Equals(object)。在這種情況下:StringBuilder.Equals(object)正如我所說,它沒有邏輯來比較這些值。僅僅比較兩個實例的參考。
  • Object.ReferenceEquals只會比較參考。

欲瞭解更多信息,請參見:

3

StringBuilder.equals不比較對象,但是從MSDN而 :

「如果此實例和Sb具有相等容量, 和MAXCAPACITY值;否則爲假。「

您正在做的其他檢查比較參考。