使用比 ReferenceEquals 更具可读性的 null 检查扩展 "object"

Extend "object" with a null check more readable than ReferenceEquals

我尝试扩展 "object" 以允许更可读地检查对象是否为 null。

现在,object.ReferenceEquals 真正地 检查一个空对象,(它不适用的极少数情况是因为运算符 == 可以被覆盖。 object.Equals(null) 方法也可以被覆盖)。

但是 object.ReferenceEquals(null, obj); 不是太可读吗?...所以,我想,为什么不给 System.object 写一个扩展方法,它将使用 [=17= 提供检查]

我试过:

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);
     }
}

我错过了什么?

您编写了一个扩展方法,扩展方法存在于不同的类型中,但通过另一种方法扩展了指定类型的对象。

但是当您调用 object.IsNull() 时,您正在寻找对象类型上存在的 静态方法

相反,您有两种调用方法的方法:

// either the static method on the class
MyExtClass.IsNull(obj);

// or using the actual feature of extension methods
obj.isNull();

因为是扩展方法,编译时会自动将后一种形式转换成前一种形式

您正在调用对象本身的扩展方法。您应该改为在实例上调用方法 -

bool itIsANull = obj.IsNull()

尝试

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);
        }
    }

扩展方法只能在 实例 上调用,不能在它们扩展的 class 上调用。所以这行代码 bool itIsANull = object.IsNull(obj); 是不正确的,因为对象是类型而不是实例。将其更改为:

bool itIsANull = (new object()).IsNull();

或者您可以在 class MyExtClass 上调用它,但不能在对象 class(位于 mscore.lib 中)上调用它:

MyExtClass.IsNull(new object());

P.S。 看起来您错过了一些关于扩展方法的内容。事实上,它们与它们扩展的 classes 无关。这只是Intellisense利用反射为我们提供的便利。

对象 class 位于 mscorelib 中并且是不可变的。你不能给它加东西。但真正发生的是 Intellisense 搜索位于 public static classes 中的所有 public 方法,并接受带有关键字 'this' 的第一个参数作为参数。如果找到一个,它是 'mapped' 到它扩展的 class。因此,当我们在 class 的实例上键入 obj.MyExtMethod() 时,编译器会自动将其转换为 Helper.MyExtMethod(obj); (如果 helper 是我们的静态 class);

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();
        }

    }