2009-04-30 42 views
15

in c#當你與兩個對象上的「==」運算符進行比較時,背景中究竟發生了什麼?它只是比較地址?或者像Equals()或CompareTo()那樣?C#==運算符詳細說明了什麼?

PS:那麼Java中的「==」運算符呢?它的行爲是否一樣?

+0

只是一個快速的信息:如果你重載==,還必須實現!=。 <= and > =也是如此。 – Tarik 2010-04-08 03:03:34

回答

24

據我知道:

  • 它值類型由值(平等)
  • 它通過引用的引用類型進行比較(同一性)
  • 除非==操作過載,然後比較它稱之爲那個。

等於在對象中實現,也可以被覆蓋。 Object中的默認實現爲參考類型執行參考比較。所以默認情況下,Equals和==也是這樣。

我想在java中你不能重載==操作符。但是我的Java知識很不合時宜。

編輯: 注意,==運營商是一個靜態方法。它在編譯時根據變量或字段的類型進行綁定。 Equals是基於實際運行時類型在運行時找到的虛擬方法。

+3

優秀的答案;至少有一個遺漏,雖然:http://stackoverflow.com/questions/806020/snip/806068#806068 – 2009-04-30 09:19:42

+0

你不能覆蓋==運算符在java中,對於java中的引用類型==將始終做一個引用(標識)比較。 – 2009-04-30 09:23:30

4

From MSDN

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

3

否... ==運算符在java和c#中並不總是表現相同。

例如使用字符串; Java ==不會比較字符串對象的引用......(如果您使用primitve類型,則java中的==比較值)。這就是爲什麼

// returns FALSE in JAVA 
(new String("test") == "test") 

不會返回在Java真的...

在C#相比之下,==操作者的行爲對字符串不同。例如,它會在以下情況下返回true:

// returns TRUE in C# 
(new String("test".ToCharArray()) == "test") 
9

進行了擴展,Stefan's excellent answer - 另一個例外是,如果操作數涉及Nullable<T> - 在這種情況下,「解禁」運營商應用(14.2。7在ECMA 334v4):

對於相等運算 == =

操作者的提升形式存在如果操作數的類型是既 非空值類型,並且如果 結果類型!是bool。解除表格 是通過添加單個?對每個操作數類型使用 修飾符。解除運算符認爲兩個空值 值相等,而空值不相等 爲任何非空值。如果兩個 操作數非空,解除操作數的操作數解除 將底層操作符應用於 生成布爾結果。

這是什麼意思是:因爲有之間的平等的運營商(比方說):

int i = ..., j = ...; 
bool eq = i == j; 

因此存在形式的隱式操作(雖然做不同):

int? i = ..., j = ...; 
bool eq; 
if(i.HasValue) { 
    if(j.HasValue) { // both have values; compare 
     eq = i.GetValueOrDefault() == j.GetValueOrDefault(); 
    } else { // one null; always false 
     eq = false; 
    } 
} else { // true if both null, else false 
    eq = !j.HasValue; 
} 
0

==運算符的行爲取決於你所應用的變量是如何聲明的(不在對象的類上,我將添加一個示例)。

對於值類型,它會比較它們的值。

對於引用類型a == b如果a與b是同一個對象,則返回true,除非==操作符被重載。不像其他人所說的那樣覆蓋,你不能在c#中重載運算符,因爲它們不是虛擬的。

object obj_a, obj_b; string str_a, str_b;

 str_a = "ABC"; 
     str_b = new string("ABC".ToCharArray()); 
     obj_a = str_a; 
     obj_b = str_b; 

     Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded 
     Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals 
     Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded 
     Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed. 
     Console.ReadKey(); 

該程序的輸出是

 
str_a == str_b = True 
str_a.Equals(str_b) = True 
obj_a == obj_b = False 
obj_a.Equals(obj_b) = True