可为空的参数检查
本文关键字:参数 检查 | 更新日期: 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?
不存在。