我尝试扩展“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/