c#中equals和= =(等於號)的比較)
相信很多人都搞不清equals和 = =的區別,只是零星的懂一點,現在就讓我帶大家來進行一些剖析
一、值型別的比較
對於值型別來說 兩者比較的都是」內容」是否相同,即值 是否一樣,很顯然此時兩者是劃等號的。
例:int i = 9;
int j = 9;
console.writeline("equals和= =(等於號)的比較");
結論:對於值型別來說 兩者是相同的 都是比較的變數的值
二、引用型別的比較
對於引用型別來說,等號(==)比較的是兩個變數的」引用」是否一樣,即是引用的」位址」是否相同。而對於equals來說仍然比較的是變數的」內容」是否一樣
1、字串的比較(string)
//對於string 字串的測試比較
string s1 = "abc";
string s2 = "abc";
console.writeline("equals和= =(等於號)的比較");
console.writeline("s1==s2 " + (s1 == s2));
console.writeline("s1.equals(s2) " + s1.equals(s2));
結果:
大家可能會問 上面說的 = =號是比較兩個引用型別的變數的引用是否一致,但是上面的s1 和s2是兩個不同的變數,為何比較的輸出是true呢?
答案: 由於string是微軟封裝的乙個字串類,在內部他已經對 = = 操作符進行了重寫。重寫後他比較的則是兩個變數的內容是否相同,下面我會給大家證明的:
使用 reflector 反編譯工具 檢視這個方法的原始碼 如下:
重寫後的= =操作符內部呼叫的即是equals方法,所以輸出的是true
2、自定義的其他引用型別——一person類為例
person p1 = new person("aa", 12);
person p2 = new person("aa", 12);
console.writeline("equals和= =(等於號)的比較");
console.writeline("p1==p2 " + (p1 == p2));//fals
console.writeline("p1.equals(p2) " + p1.equals(p2));
對於 p1==p2 比較的結果是false,這點是毫無疑問的,因為他倆是兩個不同的變數,所以引用的位址也是不同的。但是對於p1.equals(p2) 返回false,可能有人會產生疑問,p1 和p2的內容是相同的啊,為什麼他倆的比較結果卻是為false呢?。原因就在於在equals是object中的乙個虛方法,而person類中沒有對她進行重寫,因此此時呼叫的仍是父類中的equals方法。但是父類是無法知道你都有哪些成員欄位的,因此返回的是false。要想讓他能夠比較兩個變數的內容是否相同,那就應該重寫equals方法
**如下:
public override bool equals(object obj)
person p = obj as person;
//對變數的所有的屬性都要進行比較 只有都相同才返回true
if (this.age == p.age && this.name == p.name)
return true;
else
return false;
總結:equals比較的永遠是變數的內容是否相同,而= =比較的則是引用位址是否相同(前提:此種型別內部沒有對equals 或= = 進行重寫操作,否則輸出可能會有不同)
string型別是個特例,因為他的內部對這兩個都進行了重寫。
C 中Equals和 等於號 的比較
相信很多人都搞不清equals和 的區別,只是零星的懂一點,現在就讓我帶大家來進行一些剖析 對於值型別來說 兩者比較的都是 內容 是否相同,即 值 是否一樣,很顯然此時兩者是劃等號的。例 int i 9 int j 9 console.writeline equals和 等於號 的比較 結論 對於值...
神奇的等於號
在domino圈,有乙個眾所周知的秘密 越是新人,膽子越大。受了系統的打擊報復,還要以更有力的核打擊報復回去。是你讓我沒有信心掌握你的執行規則,那就玉石俱焚!於是,刪檔案的 屢屢發生。雖然冤冤相報何時了,但就在這樣的過程中有了一些神奇的發現。比如九通就愛刪檔案,無論好壞,刪了再說 萬一刪好了呢?總比...
python中等於號 python中的 號
from 傳遞實參和定義形參 所謂實參就是呼叫函式時傳入的引數,形參則是定義函式是定義的引數 的時候,你還可以使用兩個特殊的語法 呼叫函式時使用 test args 的作用其實就是把序列 args 中的每個元素,當作位置引數傳進去。比如上面這個 如果 args 等於 1,2,3 那麼這個 就等價於 ...