3 回答

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

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>
希望這可以幫助!

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
想要加上與“ null”比較的5美分。
ReferenceEquals(對象,對象)與“(object)arg1 == arg2”相同(因此,在使用值類型的情況下,您將獲得裝箱并且需要時(shí)間)。但是這種方法是在幾種情況下檢查參數(shù)是否為null的唯一100%安全的方法,例如
a)在通過調(diào)用其成員之前。算子
b)檢查AS運(yùn)算符的結(jié)果。
==和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)。
- 3 回答
- 0 關(guān)注
- 535 瀏覽
添加回答
舉報(bào)