第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

C#.Equals()、. ReferenceEquals()和==運(yùn)算符

C#.Equals()、. ReferenceEquals()和==運(yùn)算符

C#
慕慕森 2019-10-17 13:58:24
我對這三個(gè)方面的理解是:.Equals()測試數(shù)據(jù)是否相等(缺少更好的描述)。.Equals()可以為同一對象的不同實(shí)例返回True,這是最常用的方法。.ReferenceEquals() 測試兩個(gè)對象是否是同一實(shí)例,并且不能被覆蓋。==與ReferenceEquals()默認(rèn)情況下的相同,但是可以覆蓋此設(shè)置。但是C#站指出:在對象類中,Equals和  ReferenceEquals方法在語義上是等效的,只不過該方法ReferenceEquals僅適用于對象實(shí)例。該  ReferenceEquals方法是靜態(tài)的?,F(xiàn)在我不明白。誰能對此有所啟發(fā)?
查看完整描述

3 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

造成混淆的原因似乎是C#站的摘錄中有一個(gè)錯(cuò)字,該錯(cuò)字應(yīng)為:“ ...,但Equals僅適用于對象實(shí)例。ReferenceEquals方法是靜態(tài)的。”


您對每個(gè)語義含義的差異大體上是正確的(盡管“同一對象的不同實(shí)例”似乎有些混亂,但它可能應(yīng)該讀為“同一類型的不同實(shí)例” ),并且可以對其進(jìn)行覆蓋。


如果我們將其放在一邊,讓我們處理您的問題的最后一部分,即它們?nèi)绾闻c普通System.Object實(shí)例和System.Object引用一起使用(我們都需要規(guī)避的非多態(tài)性質(zhì)==)。在此,所有這三個(gè)操作將等效地工作,但有一個(gè)警告:Equals無法在上調(diào)用null。


Equals是采用一個(gè)參數(shù)(可以是null)的實(shí)例方法。由于它是一個(gè)實(shí)例方法(必須在實(shí)際對象上調(diào)用),因此不能在null-reference 上調(diào)用。


ReferenceEquals是一個(gè)采用兩個(gè)參數(shù)的靜態(tài)方法,其中兩個(gè)參數(shù)都可以是null。由于它是靜態(tài)的(不與對象實(shí)例相關(guān)聯(lián)),因此NullReferenceException在任何情況下都不會拋出。


==是運(yùn)算符,在這種情況下(object)的行為與相同ReferenceEquals。它也不會拋出NullReferenceException。


為了顯示:


object o1 = null;

object o2 = new object();


//Technically, these should read object.ReferenceEquals for clarity, but this is redundant.

ReferenceEquals(o1, o1); //true

ReferenceEquals(o1, o2); //false

ReferenceEquals(o2, o1); //false

ReferenceEquals(o2, o2); //true


o1.Equals(o1); //NullReferenceException

o1.Equals(o2); //NullReferenceException

o2.Equals(o1); //false

o2.Equals(o2); //true


查看完整回答
反對 回復(fù) 2019-10-17
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

看一下有關(guān)該主題的這篇MSDN文章。


我認(rèn)為有關(guān)的要點(diǎn)是:


要檢查引用是否相等,請使用ReferenceEquals。要檢查值是否相等,請使用“等于”或“等于”。


默認(rèn)情況下,operator ==通過確定兩個(gè)引用是否指示同一對象來測試引用是否相等,因此引用類型不需要實(shí)現(xiàn)operator ==即可獲得此功能。當(dāng)類型是不可變的,這意味著實(shí)例中包含的數(shù)據(jù)無法更改時(shí),重載運(yùn)算符==以比較值相等而不是引用相等是很有用的,因?yàn)樽鳛椴豢勺儗ο?,只要它們具有相同的值?/p>


希望這可以幫助!


查看完整回答
反對 回復(fù) 2019-10-17
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

想要加上與“ null”比較的5美分。

  1. ReferenceEquals(對象,對象)與“(object)arg1 == arg2”相同(因此,在使用值類型的情況下,您將獲得裝箱并且需要時(shí)間)。但是這種方法是在幾種情況下檢查參數(shù)是否為null的唯一100%安全的方法,例如

    • a)在通過調(diào)用其成員之前。算子

    • b)檢查AS運(yùn)算符的結(jié)果。

  2. ==和Equals()。為什么我要說ReferenceEquals使用null檢查是100%安全的?想象一下,您在核心跨項(xiàng)目庫中編寫了通用擴(kuò)展,并說您將通用參數(shù)類型限制為某些域類型。這種類型可以引入“ ==”運(yùn)算符-現(xiàn)在或以后(相信我,我已經(jīng)看到很多,這種運(yùn)算符可以具有非常“奇怪的”邏輯,尤其是在涉及域或持久性對象時(shí))。您嘗試檢查參數(shù)是否為null,然后對其調(diào)用成員操作。驚喜,您可以在此處使用NullRef。因?yàn)?=運(yùn)算符幾乎與Equals()相同-非常自定義且非常不可預(yù)測。但是有一個(gè)區(qū)別,應(yīng)該加以考慮-如果您不將通用參數(shù)限制為某些自定義類型(==僅在您的類型為“類”時(shí)才可以使用),==運(yùn)算符與object相同。ReferenceEquals(..)。等于實(shí)現(xiàn)始終是從最終類型使用的,因?yàn)樗翘摂M的。

因此,我的建議是,當(dāng)您編寫自己的類型或從知名類型派生時(shí),可以使用==檢查null。否則,請使用object.ReferenceEquals(arg,null)。


查看完整回答
反對 回復(fù) 2019-10-17
  • 3 回答
  • 0 關(guān)注
  • 535 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號