簡體   English   中英

使用null檢查擴展“對象”比ReferenceEquals更具可讀性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM