C#中equals和==的差別有哪些

高洛峰
發布: 2016-12-16 10:30:26
原創
1632 人瀏覽過

C# 中有兩種不同的相等:引用相等和值相等。


◎值相等是大家普遍理解的意義上的相等:它意味著兩個物件包含相同的值。
◎引用相等意味著要比較的不是兩個對象,而是兩個對象引用,兩者引用的是同一個對象。

 

Equals:


下面的語句中,x、y 和 z 表示不為 null 的物件引用。

* 除涉及浮點型的情況外,x.Equals(x) 都會回傳 true。
* x.Equals(y) 傳回與 y.Equals(x) 相同的值。
* 如果 x 和 y 都為 NaN,則 x.Equals(y) 傳回 true。
* 當且僅當 x.Equals(z) 傳回 true 時,(x.Equals(y) && y.Equals(z)) 才會傳回 true。
* 只要不修改 x 和 y 所引用的對象,對 x.Equals(y) 的相繼呼叫將傳回相同的值。
* x.Equals(null) 回傳 false。
 

==:


對於預先定義的值類型,如果運算元的值相等,則相等運算子 (==) 傳回 true,否則傳回 false。

對於 string 以外的參考類型,如果兩個運算元引用同一個對象,則 == 傳回 true。
對於 string 類型,== 比較字串的值。
 

Equals與==的區別

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

"equals" : 運算表示的兩個變數是否為同一個物件的引用,即堆中的內容是否相同。
而字串是一個特殊的引用型,在C#語言中,重載了string 物件的許多方法方法(包括equals()方法),使string物件用起來就像是值型別一樣。
實例

 

C# 程式碼

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
namespace ConsoleApplication1
 {
     class Person
     {
         private string name;
         public string Name
         {
             get { return name; }
             set { name = value; }
         }
         public Person(string name)
         {
             this.name = name;
         }
     }
     class program
     {
         static void Main(string[] args)
         {
             string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
             string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
             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 。
 

總結如下:


1、對於值類型,==和equals等價,都是比較儲存資訊的內容。
2、對於參考類型,==比較的是引用類型在堆疊中的位址,equals方法則比較的是引用類型在託管堆中的儲存資訊的內容。
3、對於string類要特殊處理,它是一個內部已經處理好了equals方法和==的類,故==和equals等價,都是比較儲存資訊的內容。
4、對於一些自訂的類,我們有必要重載equals方法,否則它預設為基類的equals方法(基類沒有重載Equals方法則為Object類中的Equals方法),他們的比較也為地址,而不是引用類型在託管堆中的儲存資訊的內容。


更多C#中equals和==的區別有哪些相關文章請關注PHP中文網!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!