比方說我們有01定義爲System.Object的& O2兩個物體,我situtaion O1 O2 &可以是任何以下類型:.NET對象平等
- 字符串
- 的Int32
- 雙
- 布爾
- 日期時間
- 的DBNull
那麼我該如何檢查o1是否與o2相等,因此是相同的對象還是兩者都具有相同的值&值。
我可以只做o1 == o2
或我需要做o1.Equals(o2)
或其他?
感謝,
AJ
比方說我們有01定義爲System.Object的& O2兩個物體,我situtaion O1 O2 &可以是任何以下類型:.NET對象平等
那麼我該如何檢查o1是否與o2相等,因此是相同的對象還是兩者都具有相同的值&值。
我可以只做o1 == o2
或我需要做o1.Equals(o2)
或其他?
感謝,
AJ
我會建議你使用
object.Equals(o1, o2)
如將與無效處理爲好。 (假設您希望兩個空引用比較等於。)
您應該而不是使用==
,因爲運算符不是多態應用;類型過載 ==但它們不會覆蓋它(沒有什麼可以覆蓋)。如果您使用
o1 == o2
,將比較他們參考身份,因爲變量聲明爲object
型。
使用o1.Equals(o2)
將工作除的情況下o1
爲空 - 此時它會拋出一個NullReferenceException
。
我會用Object.Equals(o1,o2)
- ref。 MSDN
Jon提供了很好的解釋,爲什麼這將是最好的用法。
運算符==通過引用比較對象,方法等於按值對比對象。
例如:
StringBuilder s1 = new StringBuilder(「Yes」);
StringBuilder s2 = new StringBuilder(「Yes」);
Console.WriteLine(s1 == s2);
Console.WriteLine(s1.Equals(s2));
將顯示:
False
True
值對象可以通過==還是equals進行比較。
'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));
輸出 真 真
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);
}
}
這樣,你會確保你的自定義對象是平等的。
+1,正是我所建議的(但晚了幾秒) – Lucero 2010-03-04 14:09:47
我想我應該在完成我的答案之前刷新答案。 :) +1 – IAbstract 2010-03-04 14:15:38
謝謝,這是有道理的。 – 2010-03-04 14:19:14