C# 中==與Equals方法比較


先來段代碼,如下:

 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);  //True
            Console.WriteLine(a.Equals(b));  //True

            object objA = (object)a;
            object objB = (object)b;

            Console.WriteLine(objA == objB);   //False
            Console.WriteLine(objA.Equals(objB));  //True


            Person p1 = new Person("user");
            Person p2 = new Person("user");

            Console.WriteLine(p1 == p2);    //False
            Console.WriteLine(p1.Equals(p2));  //False

            Person p3 = new Person("user");
            Person p4 = p3;
            Console.WriteLine(p3 == p4);   //True
            Console.WriteLine(p3.Equals(p4));  //True



            Console.Read();

        }

答案是 truetruefalsetruefalsefalsetruetrue。 

為什么會出現這個答案呢?

因為值類型是存儲在內存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。

總結如下:

1. 對於值類型,==和Equals()等價,都是比較存儲信息的內容(即比較兩個對象的值是否相同);

2. 對於除string之外的引用類型,==比較的是棧的內容是否相同(即是否指向同一個堆中地址),Equals()判斷是否對同一個對象的引用(即堆中的內容是否相同);

3. string是一種特殊的引用類型,在C#語言中,重載了Object對象的很多方法(包括equals()方法),使string對象用起來就像是值類型一樣

   下圖為string類中重載的Equals方法描述:

   

4. 對於一些自定義類,我們看看是否有重載Equals方法,如果沒有則默認為基類的Equals方法(如果基類沒有重載Equals方法則為Object類Equals方法),Object類中Equals方法比較也是棧中的地址,而不是堆中的內容。

     下圖為Object類中Equals方法描述:

   

      因此我們不難理解下面的結果:    

            Person p1 = new Person("user");
            Person p2 = new Person("user");

            Console.WriteLine(p1 == p2);    //False
            Console.WriteLine(p1.Equals(p2));  //False

5. 對於string類型有必要強調一下   

            string a = "hello";
            string b = "hello";

            object objA = (object)a;
            object objB = (object)b;

            Console.WriteLine(objA == objB);   //True
            Console.WriteLine(objA.Equals(objB));  //True

           結果:True,True

    這是因為系統並沒有給字符串b分配內存,只是將"hello"指向了b。所以a和b指向的是同一個字符串(字符串在這種賦值的情況下做了內存的優化)。

參考:http://www.oschina.net/code/snippet_188227_9009

        http://www.360doc.com/content/11/1223/14/8087789_174471124.shtml

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM