in c#當你與兩個對象上的「==」運算符進行比較時,背景中究竟發生了什麼?它只是比較地址?或者像Equals()或CompareTo()那樣?C#==運算符詳細說明了什麼?
PS:那麼Java中的「==」運算符呢?它的行爲是否一樣?
in c#當你與兩個對象上的「==」運算符進行比較時,背景中究竟發生了什麼?它只是比較地址?或者像Equals()或CompareTo()那樣?C#==運算符詳細說明了什麼?
PS:那麼Java中的「==」運算符呢?它的行爲是否一樣?
據我知道:
等於在對象中實現,也可以被覆蓋。 Object中的默認實現爲參考類型執行參考比較。所以默認情況下,Equals和==也是這樣。
我想在java中你不能重載==操作符。但是我的Java知識很不合時宜。
編輯: 注意,==
運營商是一個靜態方法。它在編譯時根據變量或字段的類型進行綁定。 Equals
是基於實際運行時類型在運行時找到的虛擬方法。
優秀的答案;至少有一個遺漏,雖然:http://stackoverflow.com/questions/806020/snip/806068#806068 – 2009-04-30 09:19:42
你不能覆蓋==運算符在java中,對於java中的引用類型==將始終做一個引用(標識)比較。 – 2009-04-30 09:23:30
對於預定義的值的類型,如果 的操作數的值相等的 等號(==)返回true, 否則爲假。對於字符串以外的參考類型 ,==返回true,如果 其兩個操作數指向相同的 對象。對於字符串類型,== 比較字符串的值。
否... ==運算符在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")
進行了擴展,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;
}
==運算符的行爲取決於你所應用的變量是如何聲明的(不在對象的類上,我將添加一個示例)。
對於值類型,它會比較它們的值。
對於引用類型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
只是一個快速的信息:如果你重載==,還必須實現!=。 <= and > =也是如此。 – Tarik 2010-04-08 03:03:34