C 中 與Equals的區別

2022-05-08 14:39:11 字數 1560 閱讀 1054

**

using system;

using system.collections.generic;

using system.text;

public string name

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。

C 中 與Equals的區別

c equals與 的區別 對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩個物件...

C 中 與Equals方法的區別

usingsystem using system.collections.generic using system.linq using system.text set public person string name class program string b new string new c...

C 中 與Equals方法的區別

輸出結果 true true false true false false true true 總結如下 1 對於值型別,和equals等價,都是比較儲存資訊的內容。2 對於引用型別,比較的是引用型別在棧中的位址,equals方法則比較的是引用型別在託管堆中的儲存資訊的內容。3 對於string類要...