gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:30:58 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com