日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Equals 和 == 的区别

發布時間:2024/1/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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都是比較棧內存中的地址是否相等

class MyClass{public string name;public MyClass(string name){this.name = name;}} ?? //------------------------測試-----------------------------MyClass str7 = new MyClass("abc"); MyClass str8 = new MyClass("abc");bool b10 = str7 == str8; //這里是引用類型比較(不是string字符串比較)所有比較是不是對同一個對象的引用,這里顯然是內存中兩個不同的引用對象。故為falsebool b11 = str7.Equals(str8); //同上 MyClass str9 = str7; //str7的地址賦值給str9。bool bl2 = str7 == str9; //true 引用同一個對象bool bl3 = str7.Equals(str9); //trueobject str10 = new object(); object str11 = new object(); bool b12 = str10 == str11; //falsebool b13=str10.Equals(str11); //false

?

?同樣我們開看看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 和 == 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。