使用null检查扩展“对象”比ReferenceEquals更具可读性

时间:2015-07-24 06:58:24

标签: c# object null referenceequals

我尝试扩展“object”以允许在对象为空时进行更易读的检查。

现在,object.ReferenceEquals 确实检查空对象,(由于操作符==可以被覆盖,所以不会应用的极少数情况。{{1} }方法也可以被覆盖)。

但是object.Equals(null)是不是太可读了?...所以,我想,为什么不写一个object.ReferenceEquals(null, obj);的扩展方法来提供System.object < / p>

我试过了:

object.IsNull(obj);

我错过了什么?

6 个答案:

答案 0 :(得分:2)

尝试

virtual

答案 1 :(得分:2)

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

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

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

MyExtClass.IsNull(new object());

P.S。 看起来你错过了一些关于扩展方法的东西。事实是,他们与他们扩展的类无关。这只是Intellisense使用反射为我们提供的便利。

对象类位于mscorelib中,并且是不可变的。你不能添加东西。但真正发生的是Intellisense搜索位于公共静态类中的所有公共方法,并接受带有关键字&#39;这个&#39;的第一个参数。作为参数。如果找到了一个,那就映射了#39;到它扩展的类。因此,当我们在该类的实例上键入obj.MyExtMethod()时,它会被编译器自动转换为Helper.MyExtMethod(obj); (如果帮助器是我们的静态类);

答案 2 :(得分:1)

您编写了扩展方法,扩展方法以不同的类型存在,但通过其他方法扩展指定类型的对象。

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

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

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

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

因为它是一个扩展方法,后一种形式将在编译时自动转换为前者。

答案 3 :(得分:1)

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

bool itIsANull = obj.IsNull()

答案 4 :(得分:1)

尝试:

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

答案 5 :(得分:1)

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

    }