C#/.NET中的相等性與同一性(==、Equals和ReferenceEquals)

開發(fā)過程中耻涛,經(jīng)常需要編碼來對不同的對象進行比較废酷。在對兩個對象是否相等的判定中從在這樣兩個概念,相等性和同一性抹缕。簡單來說澈蟆,相等性是說兩個對象包含有相同的值,而同一性指的則是兩個對象所指的實際是同一個對象卓研。

1. 值類型和引用類型

因為在進行相等性和同一性判斷的時候趴俘,值類型和引用類型有著不同的表現(xiàn),所以需要簡單的回顧一下它們的特點。
由于涉及類型的細節(jié)也比較多哮幢,有機會單獨整理一下带膀,在這里我們就只是簡單的把我們在這部分所關心的一點提一下:值類型分配在線程的堆棧上志珍,引用類型則分配在托管堆上橙垢,由GC控制回收。

2. ==

“==”操作對于值類型和引用類型有著不同的表現(xiàn)伦糯。二話不說先上代碼:

            int leftInt,rightInt;
            leftInt =99;
            rightInt = 99;
            Console.WriteLine($"Int==Int: {leftInt==rightInt}");            //True

            object leftObject,rightObject;
            leftObject = new object();
            rightObject = new object();
            Console.WriteLine($"object==object: {leftObject==rightObject}");    //False
            Console.WriteLine($"(object)Int==(object)Int: {(object)leftInt==(object)rightInt}");    //False

            leftObject = rightObject;
            Console.WriteLine($"object==object: {leftObject==rightObject}");    //True

            string leftString,rightString;
            leftString = "abcd";
            rightString = "abcd";
            Console.WriteLine($"string==string: {leftString==rightString}");    //True
            Console.WriteLine($"ReferenceEquals(string,string): {ReferenceEquals(leftString,rightString)}");    //True

由結果不難看出柜某,對于值類型來說,只要變量所包含的實際值相同敛纲,便會判定這兩個變量的值是相等的喂击;而對于引用類型而言,則是判斷其引用的對象的實例是否是同一個淤翔,如果不是同一個翰绊,那即使其所包含的實際值是相同的(如裝箱后的Int),那判定的結果也是不想等旁壮。
所以监嗜,我們可以認為“==”是對兩個對象進行同一性判斷
需要說明一點抡谐,由于.NET Framework對string類型進行了一些特殊處理(字符串拘留池的存在裁奇,以及對"=="的重載等),所以在使用“==”時麦撵,雖然string是引用類型刽肠,但其表現(xiàn)更像是值類型。

3. ReferenceEquals

ReferenceEquals是Object的靜態(tài)方法免胃,用于比較兩個引用類型的對象是否是對于同一個對象的引用音五。對于引用類型而言,就是對同一性判斷羔沙。但對于值類型躺涝,ReferenceEquals始終會返回False,因為裝箱后的引用對象總是不一樣的撬碟。

4. Equals

對于Equals诞挨,存在以下兩個版本:

       public static bool Equals(Object objA, Object objB);
       public virtual bool Equals(Object obj);

使用這兩個版本的Equals方法得到的結果是相同的,靜態(tài)方法的一點好處是不需要比較對象是否為null呢蛤。
另外惶傻,Equals方法對于值類型和引用類型的定義不同。對于值類型其障,類型相同银室,并且數(shù)值相同(對于struct的每個成員都必須相同),則Equals返回 true,否則返回false。而對于引用類型蜈敢,默認的行為與ReferenceEquals的行為相同辜荠,僅有兩個對象指向同一個Reference的時 候才返回true。
從定義上來看抓狭,Equals方法與“==”的表現(xiàn)是一致的伯病。有一點區(qū)別是對于用戶定義的值類型,如果沒有重載==操作符否过,==將是不能夠使用的午笛。

PS.先完成草稿,待補充整理苗桂。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末药磺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子煤伟,更是在濱河造成了極大的恐慌癌佩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件便锨,死亡現(xiàn)場離奇詭異围辙,居然都是意外死亡,警方通過查閱死者的電腦和手機鸿秆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門酌畜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卿叽,你說我怎么就攤上這事桥胞。” “怎么了考婴?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵贩虾,是天一觀的道長。 經(jīng)常有香客問我沥阱,道長缎罢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任考杉,我火速辦了婚禮策精,結果婚禮上,老公的妹妹穿的比我還像新娘崇棠。我一直安慰自己咽袜,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布枕稀。 她就那樣靜靜地躺著询刹,像睡著了一般谜嫉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凹联,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天沐兰,我揣著相機與錄音,去河邊找鬼蔽挠。 笑死住闯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的象泵。 我是一名探鬼主播寞秃,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偶惠!你這毒婦竟也來了?” 一聲冷哼從身側響起朗涩,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忽孽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谢床,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兄一,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年识腿,在試婚紗的時候發(fā)現(xiàn)自己被綠了出革。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡渡讼,死狀恐怖骂束,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情成箫,我是刑警寧澤展箱,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蹬昌,受9級特大地震影響混驰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜皂贩,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一栖榨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧明刷,春花似錦婴栽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽败潦。三九已至,卻和暖如春准脂,著一層夾襖步出監(jiān)牢的瞬間劫扒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工狸膏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沟饥,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓湾戳,卻偏偏與公主長得像贤旷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砾脑,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法幼驶,類相關的語法,內(nèi)部類的語法韧衣,繼承相關的語法盅藻,異常的語法,線程的語...
    子非魚_t_閱讀 31,630評論 18 399
  • 從三月份找實習到現(xiàn)在畅铭,面了一些公司氏淑,掛了不少,但最終還是拿到小米硕噩、百度假残、阿里、京東炉擅、新浪辉懒、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,246評論 11 349
  • 個人博客: 斯科特安的時間 今天看資料時看到coolshell的這篇文章坑资,獲益匪淺耗帕,收藏到文庫里。 譯文原文:ht...
    斯科特安閱讀 5,210評論 4 23
  • 最近看電視劇我的前半生袱贮,心底里的害怕又油然而生仿便,再家快三年了,再這樣下去攒巍,我是是否還具備社會競爭力嗽仪,沒有工作,感覺...
    唧唧啾啾閱讀 214評論 0 0
  • 泰戈爾有句話,世界以痛吻我兢孝,要我報之以歌窿凤。用在貝多芬身上再恰切不過仅偎。 一本優(yōu)秀的傳記不僅能讓我們認識世界,還會讓我...
    荒野尋蹤閱讀 2,441評論 0 6