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

标签 c# object null referenceequals

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

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

但是 object.ReferenceEquals(null, obj); 可读性不是很好吗?...所以,我想,为什么不给 System.object 写一个扩展方法 将使用 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 = object.IsNull(obj); 是不正确的,因为对象是类型而不是实例。将其更改为:

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

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

MyExtClass.IsNull(new object());

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

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

关于c# - 使用比 ReferenceEquals 更具可读性的 null 检查扩展 "object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604133/

相关文章:

ios - 快速访问数组中对象的属性,返回 nil

java - 无法读取控制台值 Java

java - 如何使用 null 对集合进行排序并在之后反转列表?

c# - 如何在字符串中存储颜色?

C# WinForms : On New Form Load Choose Tab Visibility

c# - 有没有一种巧妙、有效的方法可以用两个不同的参数调用同一个方法两次?

java - 在Java中对对象数组进行冒泡排序

Javascript:对象中的函数根据声明语法自动命名(或不命名)——为什么?

c# - 如何将 Telerik 网格设置为允许垂直滚动

c# - 将 null 分配给类的实例和仅声明之间有什么区别