程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#的==運算符和Equals()方法區別

C#的==運算符和Equals()方法區別

編輯:C#入門知識

using System;

using System.Collections.Generic;

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

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

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

  "equals" : 操作表示的兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。

    而字符串是一個特殊的引用型類型,在C#語言中,重載了string 對象的很多方法方法(包括equals()方法),使string對象用起來就像是值類型一樣。

    因此在上面的例子中,第一對輸出 ,字符串a和字符串b的兩個比較是相等的。

    對於 第二對輸出 object g = a 和object h = b ,  在內存中兩個不同的對象,所以在棧中的內容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果將字符串a和b作這樣的修改:

        string a="aa";

        string b="aa";

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

對於p1和p2,也是內存中兩個不同的對象,所以在內存中的地址肯定不相同,故p1==p2會返回false,又因為p1和p2又是對不同對象的引用,所以p1.equals(p2)將返回false。

對於p3和p4,p4=p3,p3將對對象的引用賦給了p4,p3和p4是對同一個對象的引用,所以兩個比較都返回true。

MSDN中就有介紹啊:

下面的規則概括了 Equals 方法和等號運算符 (==) 的實現准則:

每次實現 Equals 方法時都實現 GetHashCode 方法。這可以使 Equals 和 GetHashCode 保持同步。

每次實現相等運算符 (==) 時,都重寫 Equals 方法,使它們執行同樣的操作。這樣,使用 Equals 方法的基礎結構代碼(如 Hashtable 和 ArrayList)的行為就與用相等運算符編寫的用戶代碼相同。

每次實現 IComparable 時都要重寫 Equals 方法。

實現 IComparable 時,應考慮實現相等 (==)、不相等 (!=)、小於 ( <) 和大於 (>) 運算符的運算符重載。

不要在 Equals、GetHashCode 方法或相等運算符 (==) 中引發異常。

有關 Equals 方法的相關信息,請參見實現 Equals 方法。

在值類型中實現相等運算符 (==)

大多數編程語言中都沒有用於值類型的默認相等運算符 (==) 實現。因此,只要相等有意義就應該重載相等運算符 (==)。

應考慮在值類型中實現 Equals 方法,這是因為 System..::.ValueType 的默認實現和自定義實現都不會執行。

每次重寫 Equals 方法時都實現相等運算符 (==)。

在引用類型中實現相等運算符 (==)

大多數語言確實為引用類型提供默認的相等運算符 (==) 實現。因此,在引用類型中實現相等運算符 (==) 時應小心。大多數引用類型(即使是實現 Equals 方法的引用類型)都不應重寫相等運算符 (==)。

如果類型是 Point、String、BigNumber 等基類型,則應重寫相等運算符 (==)。每當考慮重載加法 (+) 和減法 (-) 運算符時,也應該考慮重載相等運算符 (==)。

好了,下面是考題,相信答案大家都知道了。

            Console.WriteLine((2 + 2) == 4);

            object s = 1;

            object t = 1;

            Console.WriteLine(s == t);

            string a = "hello";

            string b = String.Copy(a);

            string c = "hello";

            Console.WriteLine(a == b);

            Console.WriteLine((object)a == (object)b);

            Console.WriteLine((object)a == (object)c);

答案:TRUE, FALSE, TRUE, FALSE, TRUE

    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved