2010-03-04 48 views
9

比方說我們有01定義爲System.Object的& O2兩個物體,我situtaion O1 O2 &可以是任何以下類型:.NET對象平等

  • 字符串
  • 的Int32
  • 布爾
  • 日期時間
  • 的DBNull

那麼我該如何檢查o1是否與o2相等,因此是相同的對象還是兩者都具有相同的值&值。

我可以只做o1 == o2或我需要做o1.Equals(o2)或其他?

感謝,

AJ

回答

17

我會建議你使用

object.Equals(o1, o2) 

如將與無效處理爲好。 (假設您希望兩個空引用比較等於。)

您應該而不是使用==,因爲運算符不是多態應用;類型過載 ==但它們不會覆蓋它(沒有什麼可以覆蓋)。如果您使用

o1 == o2 

,將比較他們參考身份,因爲變量聲明爲object型。

使用o1.Equals(o2)將工作除的情況下o1爲空 - 此時它會拋出一個NullReferenceException

+0

+1,正是我所建議的(但晚了幾秒) – Lucero 2010-03-04 14:09:47

+0

我想我應該在完成我的答案之前刷新答案。 :) +1 – IAbstract 2010-03-04 14:15:38

+0

謝謝,這是有道理的。 – 2010-03-04 14:19:14

1

我會用Object.Equals(o1,o2) - ref。 MSDN

Jon提供了很好的解釋,爲什麼這將是最好的用法。

4

運算符==通過引用比較對象,方法等於按值對比對象。
例如:

StringBuilder s1 = new StringBuilder(「Yes」); 

StringBuilder s2 = new StringBuilder(「Yes」); 

Console.WriteLine(s1 == s2); 

Console.WriteLine(s1.Equals(s2)); 

將顯示:

False 

True 

值對象可以通過==還是equals進行比較。

1

'Equals'應該適用於字符串和您列出的值類型。

「==」將失敗的東西像下面的代碼,因爲原包裝對象的引用是不一樣的:

 int x = 1; 
     int y = 1; 
     Object o1 = x; 
     Object o2 = y; 

編輯: 我注意到上面給出的StringBuilder的例子,但因爲你正在使用字符串,並且它們的等於操作符被覆蓋,它們實際上可以使用「==」或「.Equals」,下面的代碼是

string s1 =「Yes」;

string s2 =「Yes」;

Console.WriteLine(s1 == s2);

Console.WriteLine(s1.Equals(s2));

輸出 真 真

0
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison. 

因此您可能還與自定義對象的工作(不是這裏的情況appearently)時考慮重寫Equals方法。

public class Something { 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public override bool Equals(object obj) { 
     if (obj == null) 
      return false; 

     if (((Something)obj) == null) 
      return false; 

     Something s = (Something)obj; 

     return this.Id == s.Id && string.Equals(this.Name, s.Name); 
    } 

    public bool Equals(Something s) { 
     if (s == null) 
      return false; 

     return this.Id == s.Id && string.Equals(this.Name, s.Name); 
    } 
} 

這樣,你會確保你的自定義對象是平等的。