a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2023-05-05 19:01:40
字體:
供稿:網(wǎng)友

本文使用一個實例具體講解了C#中“==”與Equals()方法的區(qū)別.

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

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

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

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

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

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

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

string a="aa";
  string b="aa";

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

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

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

MSDN中就有介紹啊:

下面的規(guī)則概括了 Equals 方法和等號運算符 (==) 的實現(xiàn)準則:

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

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

每次實現(xiàn) IComparable 時都要重寫 Equals 方法。

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

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

有關 Equals 方法的相關信息,請參見實現(xiàn) Equals 方法。

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

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

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

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

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

大多數(shù)語言確實為引用類型提供默認的相等運算符 (==) 實現(xiàn)。因此,在引用類型中實現(xiàn)相等運算符 (==) 時應小心。大多數(shù)引用類型(即使是實現(xiàn) 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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看 | 国产欧美日韩在线 | 国产精品中文字母 | a级毛片久久 | 青草在线视频 | 一区二区三区国产 | 日本黄色大片免费观看 | 精品久久久久久久久久久 | 亚洲欧美日韩另类精品一区二区三区 | 日本久久久久 | 99福利| 精品福利一区二区 | 欧美自拍视频 | 国产精品久久久久久久久久妇女 | 亚洲精品中文字幕乱码无线 | 国产精品久久久久久久久久久久 | 午夜激情视频免费 | 亚洲精品aaa | 欧美精品一区二区在线观看 | 国产精品久久久久永久免费观看 | 国产视频一区二区三区四区 | 国产一区在线播放 | 在线成人av | 天天干一干 | 色噜| 日韩欧美在线观看一区二区三区 | 国产在线一区二区三区视频 | 成人黄色在线视频 | 欧美中文字幕在线 | 久产久精 | 免费观看毛片 | 久久二 | 天天干人人干 | 国产精品久久久99 | 天天摸天天看 | 日韩精品一区二区三区在线 | 中文字幕在线看 | 欧美一区二区二区 | 亚洲国产成人久久综合一区,久久久国产99 | 久久精品女人 | 国精日本亚洲欧州国产中文久久 |