使用比 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();
}
}
我尝试扩展 "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();
}
}