2010-03-01 74 views

回答

15

那麼,==可以重載參考類型。例如:

string a = new string('x', 10); 
string b = new string('x', 10); 
Console.WriteLine(a == b); // True 
Console.WriteLine(Object.ReferenceEquals(a, b)); // False 

除非它被重載,否則==表示引用類型的「引用相等」,即「對象標識」。 (正如Marc所說,你可以覆蓋Equals而不會超載==。)

對於值類型,你必須重載==,否則C#編譯器不會讓你使用它進行比較。 .NET本身將提供一個實現Equals,通常做的是正確的事情,但有時候會很慢 - 在大多數情況下,如果你編寫自己的自定義值類型,則需要實現IEquatable<T>並覆蓋Equals - 並且很可能會超載各種運營商。

8

C#允許==操作超載(和被覆蓋的Equals方法 - 雖然==Equals意味着同樣的事情)。

如果你想表示「同一個實例」,那麼object.ReferenceEquals(對於引用類型)是最好的選擇。值類型默認爲內部相等。

2

直出的MSDN

對於預定義的值的類型,如果 的操作數的值相等的 等號(==)返回true, 否則返回false。對於字符串以外的參考類型 ,==返回true,如果 其兩個操作數指向相同的 對象。對於字符串類型,== 比較字符串的值。

Jon Skeet應該可以,雖然給你一個完美的答案:P

+0

他已經打敗你了! – leppie 2010-03-01 21:31:58

+0

是的,他在46秒內擊敗了我!當我在寫我的回答時,我知道Jon會提供一個非常好的答案。 – Kelsey 2010-03-01 22:59:51

0

這恰恰是它與.NET工程,以及道路。該C# FAQ blog explains equals better

equals方法只是一個虛擬 一個在System.Object的定義,並通過 爲準類選擇 重寫這樣做。 ==運算符是一個 運算符,它可以通過 類重載,但通常具有 標識行爲。

對於在==沒有 被重載引用類型,比較 兩個引用是否指向同一個對象 - 這也正是 實施的Equals的確實在 System.Object的。