Equals 和 == 的区别
在比較Equals 和 ==的區別前。我們先來了解下相關的知識
C#數據類型
1、值類型
值類型有:
值類型包括:簡單類型、結構類型、枚舉類型。
byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚舉、結構。
上述中括號中的數字表示字節數,byte、ushort、uint、ulong 為無符號類型(沒有負數),順便說一下 sbyte 是有符號的字節。
?
2、引用類型
引用類型有:對象(Object)類型、類類型、接口、代表元、字符串類型、數組。
?
new 運算符
在 C# 中, new 關鍵字可用作運算符、修飾符或約束。
??1、 new 運算符
? 用于創建對象和調用構造函數。
? 2、new 修飾符
? 用于向基類成員隱藏繼承成員。
??3、new 約束
? 用于在泛型聲明中約束可能用作類型參數的參數的類型。
?
需注意一點:凡是用new運算符就會在堆內存中開辟空間存放引用(引用地址存放在棧上)對象的值
?
==? 和 Equals 的區別
1.?== 是一個運算符。
2.Equals則是string對象的方法,可以.(點)出來。?
?
我們比較無非就是這兩種 1、基本數據類型比較? 2、引用對象比較?
1、基本數據類型比較
==和Equals都比較兩個值是否相等。相等為true 否則為false;
?
2、引用對象比較?
==和Equals都是比較棧內存中的地址是否相等?。相等為true 否則為false;
?
需注意幾點:
1、string是一個特殊的引用類型。對于兩個字符串的比較,不管是 == 和 Equals 這兩者比較的都是字符串是否相同;
2、當你創建兩個string對象時,內存中的地址是不相同的,你可以賦相同的值。
所以字符串的內容相同。引用地址不一定相同,(相同內容的對象地址不一定相同),但反過來卻是肯定的;
3、基本數據類型比較(string 除外) == 和 Equals 兩者都是比較值;
?
?接下來我們來挨個挨個看實例:
1、基本數據類型比較:== ?和 Equals 都比較具體的值
int i1 = 8;int i2 = 8;bool bo1 = i1 == i2; //truebool bo2 = (object)i1 == (object)i2; // 裝箱后變成引用類型,引用不同 故為falsebool bo3 = (i1).Equals(i2); //true 比較的是值?
2、來看一個地址不同,內容相同的比較。== 比較地址, Equals比較值
//使用了new運算符就會在內存中創建對象,地址是不相同的。字符串內容相同string str3 = new string(new char[] { 'a', 'b', 'c' });string str4 = new string(new char[] { 'a', 'b', 'c' });bool b3 = (object)str3 == (object)str4; //false 轉化成object后 是比較地址,這里內存中的地址是不相同的bool b4 = ((object)str3).Equals((object)str4); //true 此時Equals依然是比較值?
3、string字符串比較:== ?和 Equals 同樣也是比較具體的值
//string是特殊的引用類型。只要是字符串比較,不管是"=="還是"Equals"都是比較字符串的內容 string str1 = "abc";string str2 = "abc";bool b1 = str1 == str2; //truebool b2 = str1.Equals(str2); //true//使用了new運算符就會在內存中創建對象,地址是不相同的。字符串內容相同string str3 = new string(new char[] { 'a', 'b', 'c' });string str4 = new string(new char[] { 'a', 'b', 'c' });bool b3 = str3 == str4; //true 字符串比較 是比較具體的值,這里內存中的地址是不相同的bool b4 = str3.Equals(str4); //truebool b5 = str1 == str3; //truebool b6 = (str1).Equals(str3); //trueobject str5 = "abc"; //定義一個變量 str5并賦值為 abcobject str6 = "abc"; //定義一個變量 str6并指向字符串abcbool b7 = str5 == str6; //truebool b8 = (object)str5 == (object)str6; //但這樣就是比較引用是否相同,因為str5 和 str6 引用同一個實例 即為 truebool b9 = str5.Equals(str6); //true在上個列子中b3和b4都是true,我們來看看str3和str4在內存中的地址是否相等?其實是不相等的。用new操作符創建的對象都會在內存中分配一個新的內存地址,同時也可以證明這里比較的是值,而不是地址;更進一步證明相同內容的對象地址不一定相同。
?
如何調出內存窗口?如圖:(啟動調試后,這里可以調出多個內存窗口)用來比較地址
4、引用類型比較:?==和Equals都是比較棧內存中的地址是否相等
?
?同樣我們開看看str7 str8 str9 分別在內存中的地址,紅框標記(str7,str9)可以看出地址是相等的
?
?
看到這里也許你疑惑了,既然引用類型比較 == 和Equals都是比較地址,那就沒區別嗎?
?Equals是string類下的一個方法,既然知道它的來路。我們就可以看看它內部源碼的實現,打開Reflector查找string。
?找到Equals(Object obj) 和Equals(string value)
看到內部也是用==來實現的,并且看到Object的比較是轉換成string后比較。
?
好了,繼續來講,在引用類型比較中,== 和Equals都是比較地址外,Equals突出的地方。一個對象除了地址相同。還有其他獨有的特征。
比如我們要比較某人都來自中國(內存地址),并且都來自中國香港(內存地址獨有的特征或性質),
當符合這兩個條件我們才說明這個對象是相等的。那么此時 == 和Equals都無能為力。但Equals有它鶴立雞群的地方。
查看Equals定義會發現,Equals是virtual方法:? public virtual bool Equals(object obj); 既然是virtual我們就可以重寫Equals方法,來編寫自己的業務邏輯
嗯!來編寫一個測試類,并且override Equals方法
class MyClass{public string country; //國家public string city; //城市public MyClass(string country, string city){this.country = country;this.city = city;}public override bool Equals(object obj){string ci = ((MyClass)obj).city;string co = ((MyClass)obj).country;if (ci == "香港" && co == "cn")return true;return false;}}?
?測試:
MyClass str7 = new MyClass("cn","香港");MyClass str8 = new MyClass("cn","香港");MyClass str18 = new MyClass("cn", "臺灣");bool na = str7.Equals(str8); //truebool an = str7.Equals(str18); //false?
最后談談這兩個有什么區別:
string str1 = "abc";string str3 = new string(new char[] { 'a', 'b', 'c' });以上這兩句話大家應該都見得多,比如str3這句筆試題居多,大體都是創建了幾個string對象。回答理所當然是兩個。一個是"abc"駐留,
一個是new string("abc")的時候在堆內存上的數據"abc",棧內存則保存了對"abc"的引用,不是對象。通俗一點就是棧上的引用地址指向堆中的值或內容。
來看看str1這句,這并沒有創建對象。即沒有在內存中分配空間。因為沒有使用new運算符,這里僅僅是聲明了一個指向對象的引用變量str1,暫時指向"abc",
所以這里只創建了一個string對象,所以要區分用new和沒有用new的方式
看看下面這個列子是創建了3個對象。因為字符串是不可變的
string x = "ab";string y = "a";string x = x + y;?
不知道C#中有沒有常量池這一概念。還有看到網上很多這樣的 string str = new string("abc") 可我真的沒找到stirng的這個重載函數
?
---------Equals 和 == 的區別末前就了解這么多。知識比較基礎,閱歷還不夠。剛出來混的。不足之處還請多多指教,文明發言。共同學習。謝謝!
?
?
?
?
轉載于:https://www.cnblogs.com/nsky/archive/2013/03/01/2939268.html
總結
以上是生活随笔為你收集整理的Equals 和 == 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse+pydev添加已存在dj
- 下一篇: Sql server 事务的两种用法