我經常在源代碼中看到if(object.ReferenceEquals(myObject,null))用於檢查myObject是否爲空而不是if(myObject == null)我很熟悉。檢查對象是否爲空的最佳和最快的方法
是否有任何特殊的原因(如速度,可讀性等)使用第一種方式而不是第二種?你使用哪一個?
預先感謝您。
我經常在源代碼中看到if(object.ReferenceEquals(myObject,null))用於檢查myObject是否爲空而不是if(myObject == null)我很熟悉。檢查對象是否爲空的最佳和最快的方法
是否有任何特殊的原因(如速度,可讀性等)使用第一種方式而不是第二種?你使用哪一個?
預先感謝您。
使用ReferenceEquals
時,請確保沒有進行特殊處理(例如重載操作符)。如果使用未綁定的泛型,這也會導致不同的結果。
的==
操作員可以通過類實現重載,所以它可能不是做參考對比(雖然它可能應該與null
S)。 object.ReferenceEquals
不能,所以它可靠總是做一個參考比較。
乾杯 馬蒂亞斯
該方法的ReferenceEquals不能被覆蓋,所以你總是可以肯定的是,比較會比較的對象引用,而不是被傳遞給equals方法的一些覆蓋。
他們通常有同樣的效果,雖然它們編譯成不同的東西。 if (myObject == null)
結果爲ceq
操作碼,我希望這個操作碼可以編譯爲更快的代碼。 object.ReferenceEquals
是一個像其他任何方法調用。
當myObject
有operator=
方法時它們不同;當存在時,您的代碼會調用此方法而不是使用ceq
。 operator=
然後可以做任何喜歡的事情。除非你有理由不這樣做,否則總是if (myObject == null)
。
僅僅因爲它是IL中的一個方法調用,並不意味着這是一個抖動完成後的方法調用。參考等於很短,所以很可能被內聯。它的內容只是'obj1 == obj2',所以我期望與==完全相同的性能,但是它將參數轉換爲對象,所以任何重載的==運算符都不會影響它。 – CodesInChaos 2010-12-10 11:14:14
它不是像任何其他的「方法調用」,編譯時,IL將不會調用它,而是使用特殊的IL代碼,這兩種方法都是相同的(自.NET 4.0起)。 @CodesInChaos是正確的,它是完全一樣的性能(和IL)。 – Abel 2017-11-19 01:49:55
那篇文章已經過時了,說到錯誤的結論。在.NET 4.0及以上版本中,這兩種方法的IL完全相同。您可以通過嘗試使用該文章中的示例輕鬆看到這一點。爲了可讀性,我會建議'ReferenceEquals'。 – Abel 2017-11-19 01:46:54