熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 09:52:48  來源: .NET編程 

  using System;

  using SystemCollectionsGeneric;

  using SystemText;

  namespace ConsoleApplication

  {

  class Person

  {

  private string name;

  public string Name

  {

  get { return name; }

  set { name = value; }

  }

  public Person(string name)

  {

  thisname = 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 });

  ConsoleWriteLine(a == b);

  ConsoleWriteLine(aEquals(b));

  object g = a;

  object h = b;

  ConsoleWriteLine(g == h);

  ConsoleWriteLine(gEquals(h));

  Person p = new Person(jia);

  Person p = new Person(jia);

  ConsoleWriteLine(p == p);

  ConsoleWriteLine(pEquals(p));

  Person p = new Person(jia);

  Person p = p;

  ConsoleWriteLine(p == p);

  ConsoleWriteLine(pEquals(p));

  ConsoleReadLine();

  }

  }

  }

  答案為何為true true false true  false false true true

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

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

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

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

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

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

  string a=aa;

  string b=aa;

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

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

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

  MSDN中就有介紹啊

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

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

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

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

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

  不要在 EqualsGetHashCode 方法或相等運算符 (==) 中引發異常

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

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

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

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

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

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

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

  如果類型是 PointStringBigNumber 等基類型則應重寫相等運算符 (==)每當考慮重載加法 (+) 和減法 () 運算符時也應該考慮重載相等運算符 (==)

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

  ConsoleWriteLine(( + ) == );

  object s = ;

  object t = ;

  ConsoleWriteLine(s == t);

  string a = hello;

  string b = StringCopy(a);

  string c = hello;

  ConsoleWriteLine(a == b);

  ConsoleWriteLine((object)a == (object)b);

  ConsoleWriteLine((object)a == (object)c);

  答案TRUE FALSE TRUE FALSE TRUE


From:http://tw.wingwit.com/Article/program/net/201311/11844.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.