2010-12-10 221 views
8

我經常在源代碼中看到if(object.ReferenceEquals(myObject,null))用於檢查myObject是否爲空而不是if(myObject == null)我很熟悉。檢查對象是否爲空的最佳和最快的方法

是否有任何特殊的原因(如速度,可讀性等)使用第一種方式而不是第二種?你使用哪一個?

預先感謝您。

回答

5

使用ReferenceEquals時,請確保沒有進行特殊處理(例如重載操作符)。如果使用未綁定的泛型,這也會導致不同的結果。

1

==操作員可以通過類實現重載,所以它可能不是做參考對比(雖然它可能應該與null S)。 object.ReferenceEquals不能,所以它可靠總是做一個參考比較。

乾杯 馬蒂亞斯

1

該方法的ReferenceEquals不能被覆蓋,所以你總是可以肯定的是,比較會比較的對象引用,而不是被傳遞給equals方法的一些覆蓋。

4

簡單的事情通常是最有效的: (myObject == null)更高性能

this文章

+0

引用的文章,雖然看似有趣的閱讀,但面向.NET 2.0。在.NET 4.0出現一段時間的時候,使用'(object)myObj == null'和'ReferenceEquals'沒有區別。然而,你在這篇文章中的建議(7年前)非常危險(正如鏈接文章中所解釋的),並且當然不應該在沒有演員的情況下使用(除非你真的想要使用可能的超載,但是「高性能「與它無關)。 – Abel 2017-11-19 01:44:32

1

他們通常有同樣的效果,雖然它們編譯成不同的東西。 if (myObject == null)結果爲ceq操作碼,我希望這個操作碼可以編譯爲更快的代碼。 object.ReferenceEquals是一個像其他任何方法調用。

myObjectoperator=方法時它們不同;當存在時,您的代碼會調用此方法而不是使用ceqoperator=然後可以做任何喜歡的事情。除非你有理由不這樣做,否則總是if (myObject == null)

+0

僅僅因爲它是IL中的一個方法調用,並不意味着這是一個抖動完成後的方法調用。參考等於很短,所以很可能被內聯。它的內容只是'obj1 == obj2',所以我期望與==完全相同的性能,但是它將參數轉換爲對象,所以任何重載的==運算符都不會影響它。 – CodesInChaos 2010-12-10 11:14:14

+0

它不是像任何其他的「方法調用」,編譯時,IL將不會調用它,而是使用特殊的IL代碼,這兩種方法都是相同的(自.NET 4.0起)。 @CodesInChaos是正確的,它是完全一樣的性能(和IL)。 – Abel 2017-11-19 01:49:55

相關問題