扩展“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);
}
}
我错过了什么?
扩展方法只能在实例上调用,而不能在它们扩展的类上调用。所以这行代码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();
}
}