2012-03-05 52 views
0

让我们假设我写在C#中的公共API:可空参数检查

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

// ... other business logic 
} 

我不知道有没有,我并不需要检查参数值,如果我有不能为空参数任何保证( object?param)作为方法参数?换句话说就是上面的例子检查null多余?

+0

请不要用“C#”等标题加前缀。这就是标签的用途。 – 2012-03-05 18:19:35

+1

除此之外:您可能想要使用带有两个'string'参数的'ArgumentNullException'构造函数:'paramName'和'message'。 – HABO 2012-03-05 18:22:24

回答

1

不,引用类型总是可为空的。试试吧:拨打Method(null);,你会得到一个运行时间ArgumentNullException,你正是把它放在代码中的地方。您不会收到编译器错误,因为null是引用类型的有效值。

对于价值类型,这是一个不同的故事。如果您有int类型的参数,则它不能为空。实际上,编译器甚至不会接受if (i == null)

1

如果您的参数输入为参考类型,则始终可以将null作为值传递。因此,这种检查,当只考虑Method从来没有多余。

有可能对给定方法的上下文特定分析证明null从不使用。例如

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

在这个特定背景,你可以证明Method永远不能用一个null值(不包括基于当然反射调用的)调用。但是这种类型的确定只能通过具体情况分析来完成

0

如果这是多余的,不能在这个单一方法的范围内定义,而是在程序的域中定义。这个方法用在哪里?它起什么作用?在程序发生故障时应该发生什么

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

0

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