C#中equal與==的區別
C#中equal與==的區別
來源 https://www.cnblogs.com/dearbeans/p/5351695.html
C#中,判斷相等有兩種方式,一種是傳統的==操作,一種是object提供的Equals方法。二者的區別在於:
一、==操作符判斷的是堆棧中的值,Equlas判斷的是堆中的值。
C#提供值類型和引用類型,值類型存儲在棧上,故用==判斷是直接判斷其值是否相等,因為值類型不存在堆中的數據,因此值類型的Equals也是判斷數據。即,對於值類型而言,==與Equals相同,均是判斷其值是否相等。
對於引用類型而言,其棧中存儲的是對象的地址,那麽==就是比較兩個地址是否相等,即是否指向同一個對象;Equals函數則是比較兩個對象在堆中的數據是否一樣,即兩個引用類型是否是對同一個對象的引用。
二、String類型特殊
String類型雖然是引用類型,但是對String對象的賦值卻按照值類型操作。
例如:
String s1="hello"; String s2="hello";
對s2初始化的時候,並沒有重新開辟內存,而是直接將其地址指向s1的內容“hello”。這樣一來,string類型雖然是引用類型,但是其==操作和Equals操作都是一樣的,均比較值是否相等。
三、與GetHashCode()的關系
若兩對象Equals相等,那麽其GetHashCode()必定相等;但是反過來,若GetHashCode()相等,那麽這兩個對象Equals方法比較結果不一定相同。(為了獲取最佳性能,hash函數為對象內容生成的數字是隨機分布的,這就意味著,內容不同的對象,有可能生成的數字是一樣的,但可以認為這種概率非常小)。
下面示例說明:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class People { private string name; public string Name { get { return name; } set { name = value; } } public People(string name) { this.name = name; } } class Program { static void Main(string[] args) { string a = "hello"; string b = new string(new char[] { ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘ }); Console.WriteLine(a == b); Console.WriteLine(a.Equals(b)); Console.WriteLine("\n"); Int32 m = 3; Int32 n = 3; Console.WriteLine(n == m); Console.WriteLine(n.Equals(m)); Console.WriteLine("\n"); object g = a; object h = b; Console.WriteLine(g == h); Console.WriteLine(g.Equals(h)); Console.WriteLine(g.GetHashCode() + " " + h.GetHashCode()); Console.WriteLine("\n"); People p1 = new People("Jimmy"); People p2 = new People("Jimmy"); Console.WriteLine(p1 == p2); Console.WriteLine(p1.Equals(p2)); Console.WriteLine(p1.GetHashCode() + " " + p2.GetHashCode()); Console.WriteLine("\n"); People p3 = new People("Jimmy"); People p4 = p3; Console.WriteLine(p3 == p4); Console.WriteLine(p3.Equals(p4)); } } }
運行結果如下:
True True True True False True -695839 -695839 False False 46104728 12289376 True True 請按任意鍵繼續. . .
在C#中,string 類型的特點有:
(1)屬於基本數據類型;
(2)是引用類型;
(3)只讀;
(4) string a="1123";
string b="1123";
那麽a和b指向同一個內存地址;
但是並非2個相同值相等的字符串就對應同一個內存地址;
(5)2個string 類型做“==”操作,先判斷內存地址是否相同,如果相同,則立即返回true;如果內存地址不相同,則繼續判斷值是否相同。
下面示例說明:
static void Main(string[] args) { string a = new string(new char[] { ‘c‘, h‘, e‘,n‘, ‘1‘ }); string b = new string(new char[] { ‘c‘, h‘, e‘,n‘, ‘1‘ }); Console.WriteLine(a == b); //結果為true Console.WriteLine(a.Equals(b));//結果為true object g = a; object h = b; Console.WriteLine(g == h);//結果為false Console.WriteLine(g.Equals(h));//結果為true Person p1 = new Person("csw"); Person p2 = new Person("csw"); Console.WriteLine(p1 == p2);//結果為false Console.WriteLine(p1.Equals(p2));//結果為false Person p3 = new Person("csw"); Person p4 = p3; Console.WriteLine(p3 == p4);//結果為true Console.WriteLine(p3.Equals(p4));//結果為true Console.ReadLine(); }
========== End
C#中equal與==的區別