可为空的参数检查

本文关键字:参数 检查 | 更新日期: 2023-09-27 18:26:51

假设我用C#编写公共API:

public void Method(object param) 
{
    if(param == null) 
    {
        throw new ArgumentNullException("Specified 'param' can not be null");
    }
// ... other business logic
}

我想知道如果我没有可空参数(对象? 参数(作为方法参数,是否可以保证我不需要检查参数的空换句话说,上面的示例检查是多余的吗?

可为空的参数检查

否,引用类型始终可为空。试一试:调用Method(null);,你会得到一个运行时ArgumentNullException,正是你把它扔到代码中的位置。您不会收到编译器错误,因为 null 是引用类型的有效值。

对于值类型,情况就不同了。如果您有类型 int 的参数,则它不能为空。事实上,if (i == null)甚至不会被编译器接受。

如果参数键入为引用类型,则始终可以将null作为值传递。 因此,当只考虑Method时,这种检查永远不会是多余的。

对给定方法的特定上下文分析可以证明从未使用过null。 例如

sealed class Example {
  void Method(object p) {
    ...
  }
  void Other() {
    Method("hello");
  }
}

在此特定上下文中,您可以证明不能使用 null 值调用Method(当然不包括基于反射的调用(。 但这种类型的确定只能通过特定上下文的分析来完成

如果这是否冗余,则不能在此单一方法的范围内定义,而是在您的程序域内定义。这种方法在哪里使用?它支持做什么?当程序失败时,程序应该发生什么?

回答

这个问题,你会发现自己在回答你自己的问题。

它不是多余的,因为类型 object 的变量可以设置为 null,因为它是引用类型。类型 object? 不存在。