可以为空的参数检查

时间:2012-03-05 18:14:41

标签: c# parameters nullable

假设我在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 冗余?

4 个答案:

答案 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?不存在。