国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

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

2023-05-05 19:01:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文使用一個(gè)實(shí)例具體講解了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

因?yàn)橹殿愋褪谴鎯?chǔ)在內(nèi)存中的堆棧(以后簡(jiǎn)稱棧),而引用類型的變量在棧中僅僅是存 儲(chǔ)引用類型變量的地址,而其本身則存儲(chǔ)在堆中。

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

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

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

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

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

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

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

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

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

MSDN中就有介紹啊:

下面的規(guī)則概括了 Equals 方法和等號(hào)運(yùn)算符 (==) 的實(shí)現(xiàn)準(zhǔn)則:

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

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

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

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

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

有關(guān) Equals 方法的相關(guān)信息,請(qǐng)參見(jiàn)實(shí)現(xiàn) Equals 方法。

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

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

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

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

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

大多數(shù)語(yǔ)言確實(shí)為引用類型提供默認(rèn)的相等運(yùn)算符 (==) 實(shí)現(xiàn)。因此,在引用類型中實(shí)現(xiàn)相等運(yùn)算符 (==) 時(shí)應(yīng)小心。大多數(shù)引用類型(即使是實(shí)現(xiàn) Equals 方法的引用類型)都不應(yīng)重寫(xiě)相等運(yùn)算符 (==)。

如果類型是 Point、String、BigNumber 等基類型,則應(yīng)重寫(xiě)相等運(yùn)算符 (==)。每當(dāng)考慮重載加法 (+) 和減法 (-) 運(yùn)算符時(shí),也應(yīng)該考慮重載相等運(yùn)算符 (==)。

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

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ā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武威市| 哈巴河县| 新宁县| 黄梅县| 河北区| 司法| 丹寨县| 元江| 云梦县| 高阳县| 永善县| 扎兰屯市| 洪雅县| 攀枝花市| 陆良县| 武冈市| 新巴尔虎右旗| 罗源县| 大庆市| 综艺| 隆安县| 牟定县| 保亭| 长宁区| 防城港市| 安图县| 托克托县| 邵阳县| 清徐县| 宣恩县| 渝中区| 育儿| 息烽县| 四川省| 临江市| 左云县| 浦县| 旌德县| 衡阳市| 太康县| 拉萨市|