![](/img/trans.png)
[英]Is "ReferenceEquals(myObject, null)" better practice than "myObject == null"?
[英]Extend “object” with a null check more readable than ReferenceEquals
我試圖擴展“對象”,以便在對象為空時允許更可讀的檢查。
現在, object.ReferenceEquals
確實檢查了一個空對象,(由於操作符==
可以被覆蓋,所以它不會應用的極少數時候。 object.Equals(null)
方法也可以被覆蓋)。
但是object.ReferenceEquals(null, obj);
它是不是太可讀了?...所以,我想,為什么不寫一個擴展方法到System.object
,它將提供使用object.IsNull(obj);
檢查object.IsNull(obj);
我試過了:
public static class MyExtClass
{
// the "IsNull" extension to "object"
public static bool IsNull(this object obj)
{
return object.ReferenceEquals(obj, null);
}
}
public SomeOtherClass
{
public static void TryUsingTheExtension()
{
object obj;
// Why does this line fail? the extension method is not recognized
// I get: 'object' does not contain a definition for "IsNull"
bool itIsANull = object.IsNull(obj);
}
}
我錯過了什么?
嘗試
bool itIsANull = obj.IsNull();
擴展方法只能在實例上調用,而不能在它們擴展的類上調用。 所以這行代碼bool itIsANull = object.IsNull(obj);
是不正確的,因為對象是類型而不是實例。 將其更改為:
bool itIsANull = (new object()).IsNull();
或者您可以在類MyExtClass上調用它,但不能在對象類(位於mscore.lib中)上調用它:
MyExtClass.IsNull(new object());
PS看起來你錯過了一些關於擴展方法的東西。 事實是,他們與他們擴展的類無關。 這只是Intellisense使用反射為我們提供的便利。
對象類位於mscorelib中,並且是不可變的。 你不能添加東西。 但真正發生的是Intellisense搜索位於公共靜態類中的所有公共方法,並接受帶有關鍵字“this”作為參數的第一個參數。 如果找到一個,它會'映射'到它擴展的類。 因此,當我們在該類的實例上鍵入obj.MyExtMethod()時,它會被編譯器自動轉換為Helper.MyExtMethod(obj); (如果幫助者是我們的靜態類);
您編寫了一個擴展方法,擴展方法以不同的類型存在,但是通過另一種方法擴展指定類型的對象。
但是當你調用object.IsNull()
,你正在尋找一個存在於對象類型上的靜態方法 。
相反,您有兩種方法來調用您的方法:
// either the static method on the class
MyExtClass.IsNull(obj);
// or using the actual feature of extension methods
obj.isNull();
因為它是一個擴展方法,后一種形式將在編譯時自動轉換為前者。
您正在調用對象本身的擴展方法。 你應該在實例上調用methd -
bool itIsANull = obj.IsNull()
嘗試:
class Program
{
static void Main(string[] args)
{
var o = new object();
if (o.IsNull())
{
Console.Write("null");
}
}
}
public static class Request
{
public static bool IsNull(this object obj)
{
return ReferenceEquals(obj, null);
}
}
public static class MyExtClass
{
// the "IsNull" extension to "object"
public static bool IsNull(this object obj)
{
return object.ReferenceEquals(obj, null);
}
}
public class SomeOtherClass
{
public static void TryUsingTheExtension()
{
object obj =null;
bool itIsANull = obj.IsNull();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.