假设我在C#编写公共API:
public void Method(object param)
{
if(param == null)
{
throw new ArgumentNullException("Specified 'param' can not be null");
}
// ... other business logic
}
我想知道如果我有不可为空的参数(对象?param null 值的参数>)作为方法参数?换句话说,上面的示例是检查 null 冗余?
答案 0 :(得分:1)
如果您的参数键入引用类型,则null
始终可以作为值传递。因此,当仅考虑Method
时,此检查永远不会是多余的。
有可能对给定方法的特定于上下文的分析证明永远不会使用null
。例如
sealed class Example {
void Method(object p) {
...
}
void Other() {
Method("hello");
}
}
在此特定上下文中,您可以证明Method
不能使用null
值进行调用(当然不包括基于反射的调用)。但这种类型的决定只能通过特定情境分析来完成
答案 1 :(得分:1)
不,引用类型始终可以为空。试试吧:调用Method(null);
,你将得到一个运行时ArgumentNullException
,正是你在代码中抛出它的地方。您没有收到编译器错误,因为null是引用类型的有效值。
对于价值类型而言,这是一个不同的故事。如果您具有类型int
的参数,则它不能为空。实际上,编译器甚至不会接受if (i == null)
。
答案 2 :(得分:0)
如果这是多余的,则不能在此单一方法的范围内定义,而是在程序域内定义。使用这种方法的地方?它有什么用呢?当程序失败时,会发生什么?
回答这个问题,你会发现自己在回答自己的问题。
答案 3 :(得分:0)
这不是多余的,因为类型object
的变量可以设置为null,因为它是引用类型。类型object?
不存在。