扩展“object"null检查比ReferenceEquals更具可读性

本文关键字:ReferenceEquals 可读性 检查 null object quot 扩展 | 更新日期: 2023-09-27 18:04:29

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

现在,object.ReferenceEquals 真的检查null对象,(它很少不适用,因为操作符==可以被覆盖。object.Equals(null)方法也可以被覆盖)。

但是object.ReferenceEquals(null, obj);不是太可读是吗?…所以,我想,为什么不为System.object编写一个扩展方法,使用object.IsNull(obj);

提供检查呢?

I've try:

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"null检查比ReferenceEquals更具可读性

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

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

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

MyExtClass.IsNull(new object());

注:看起来您遗漏了一些关于扩展方法的内容。事实是,它们与它们所扩展的类无关。这只是智能感知通过使用反射为我们提供的一种方便。

Object类位于mscorelib中,并且是不可变的。你不能往里面加东西。但真正发生的是智能感知搜索位于公共静态类中的所有公共方法,并接受第一个参数,关键字'this'作为参数。如果找到一个,它会被"映射"到它所扩展的类。所以当我们在那个类的实例上输入obj. myextmethod()时,它会被编译器自动转换为Helper.MyExtMethod(obj);(如果helper是静态类);

Try

bool itIsANull = obj.IsNull();

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

但是当你调用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()

尝试:

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