簡體   English   中英

C#==運算符詳細說明了什么?

[英]C# what does the == operator do in detail?

在c#中,當你在兩個對象上與“==”運算符進行比較時,后台究竟發生了什么? 它只是比較地址? 或者像Equals()或CompareTo()這樣的東西?

PS:java中的“==”運算符怎么樣? 它的行為是否相同?

我所知道的:

  • 它按值比較值類型(相等)
  • 它通過引用比較引用類型(標識)
  • 除非==運算符被重載,否則它會調用那個。

Equals在object中實現,也可以被覆蓋。 Object中的默認實現執行引用類型的引用比較。 所以默認情況下,Equals和==也是這樣。

我認為在java中你不能重載==運算符。 但我的Java知識已經過時了。

編輯:請注意, ==運算符是靜態方法。 它在編譯時綁定,基於變量或字段的類型。 Equals是一種基於實際運行時類型在運行時找到的虛方法。

作為Stefan優秀答案的延伸 - 另一個例外是操作數涉及Nullable<T> - 在這種情況下“提升”運算符適用(ECMA 334v4中為14.2.7):

對於相等運算符==!=

如果操作數類型都是非可空值類型並且結果類型是bool,則存在提升形式的運算符。 提升形式是通過添加一個? 每個操作數類型的修飾符。 提升的運算符認為兩個空值相等,並且空值不等於任何非空值。 如果兩個操作數都為非null,則提升的運算符將解包操作數並應用基礎運算符以生成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;
}

來自MSDN

對於預定義的值類型,如果操作數的值相等,則相等運算符(==)返回true,否則返回false。 對於除string之外的引用類型,如果其兩個操作數引用同一對象,則==返回true。 對於字符串類型,==比較字符串的值。

否...... ==運算符在java和c#中的行為並不總是相同。

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

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

在java中不會返回true ...

相反,在C#中,==運算符在字符串上的行為不同。 例如,在以下情況下它將返回true:

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

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

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

對於引用類型,如果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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM