c 與equals有什麼區別

2021-06-22 13:51:00 字數 2880 閱讀 8880



對於值型別、引用型別來說比較過程怎樣的?

using system;

using system.collections.generic;

using system.text;

set

}public person(string name)

}class program

);string b = new string(new char );

console.writeline(a == b);

console.writeline(a.equals(b));

object g = a;

object h = b;

console.writeline(g == h);

console.writeline(g.equals(h));

person p1 = new person("jia");

person p2 = new person("jia");

console.writeline(p1 == p2);

console.writeline(p1.equals(p2));

person p3 = new person("jia");

person p4 = p3;

console.writeline(p3 == p4);

console.writeline(p3.equals(p4));

console.readline();}}

}答案為何為true true false true false false true true

因為值型別是儲存在記憶體中的堆疊(以後簡稱棧),而引用型別的變數在棧中僅僅是儲存引用型別變數的位址,而其本身則儲存在堆中。

"==" : 操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中儲存的位址是否相同,即棧中的內容是否相同。

"equals" : 操作表示的兩個變數是否是對同乙個物件的引用,即堆中的內容是否相同。

而字串是乙個特殊的引用型型別,在c#語言中,過載了string 物件的很多方法方法(包括equals()方法),使string物件用起來就像是值型別一樣。

因此在上面的例子中,第一對輸出 ,字串a和字串b的兩個比較是相等的。

對於 第二對輸出 object g = a 和object h = b , 在記憶體中兩個不同的物件,所以在棧中的內容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果將字串a和b作這樣的修改:

string a="aa";

string b="aa";

則,g和h的兩個比較都是相等的。這是因為系統並沒有給字串b分配記憶體,只是將"aa"指向了b。所以a和b指向的是同乙個字串(字串在這種賦值的情況下做了記憶體的優化)。

對於p1和p2,也是記憶體中兩個不同的物件,所以在記憶體中的位址肯定不相同,故p1==p2會返回false,又因為p1和p2又是對不同物件的引用,所以p1.equals(p2)將返回false。

對於p3和p4,p4=p3,p3將對物件的引用賦給了p4,p3和p4是對同乙個物件的引用,所以兩個比較都返回true。

msdn中就有介紹啊:

下面的規則概括了 equals 方法和等號運算子 (==) 的實現準則:

每次實現 equals 方法時都實現 gethashcode 方法。這可以使 equals 和 gethashcode 保持同步。

每次實現相等運算子 (==) 時,都重寫 equals 方法,使它們執行同樣的操作。這樣,使用 equals 方法的基礎結構**(如 hashtable 和 arraylist)的行為就與用相等運算子編寫的使用者**相同。

每次實現 icomparable 時都要重寫 equals 方法。

實現 icomparable 時,應考慮實現相等 (==)、不相等 (!=)、小於 ( <) 和大於 (>) 運算子的運算子過載。

不要在 equals、gethashcode 方法或相等運算子 (==) 中引發異常。

有關 equals 方法的相關資訊,請參見實現 equals 方法。

在值型別中實現相等運算子 (==)

大多數程式語言中都沒有用於值型別的預設相等運算子 (==) 實現。因此,只要相等有意義就應該過載相等運算子 (==)。

應考慮在值型別中實現 equals 方法,這是因為 system..::.valuetype 的預設實現和自定義實現都不會執行。

每次重寫 equals 方法時都實現相等運算子 (==)。

在引用型別中實現相等運算子 (==)

大多數語言確實為引用型別提供預設的相等運算子 (==) 實現。因此,在引用型別中實現相等運算子 (==) 時應小心。大多數引用型別(即使是實現 equals 方法的引用型別)都不應重寫相等運算子 (==)。

如果型別是 point、string、bignumber 等基型別,則應重寫相等運算子 (==)。每當考慮過載加法 (+) 和減法 (-) 運算子時,也應該考慮過載相等運算子 (==)。

好了,下面是考題,相信答案大家都知道了。

console.writeline((2 + 2) == 4);

object s = 1;

object t = 1;

console.writeline(s == t);

string a = "hello";

string b = string.copy(a);

string c = "hello";

console.writeline(a == b);

console.writeline((object)a == (object)b);

console.writeline((object)a == (object)c);

答案:true, false, true, false, true

c 中 與equals有什麼區別

對於值型別 引用型別來說比較過程怎樣的?using system using system.collections.generic using system.text set public person string name class program string b new string ne...

和equals有什麼區別

分為兩種情況 1.比較的型別是基本資料型別時,只比較他們的值是否相等。2.比較型別為引用型別時,比較的是引用變數的記憶體位址是否相同。equals 1.對於普通物件來說,equals 函式原始碼就是實現 所以就是比較引用是否相同。基本型別沒有equals方法 2.對於string來說,就是比較值是否...

常問到 equals 與 有什麼區別?

介紹一下 equals 與 的區別 equals 不能用於基本型別的比較 是對字串的內容進行比較 對於基本型別,比較的是值 對於引用型別,比較的是位址 string a abcd string b abcd if a b else 如果沒有重寫equals,equals就相當於 如果重寫了equal...