何时检查null参数并抛出ArgumentNullException

时间:2011-12-22 06:18:46

标签: c#

我有一些像这样的代码:

public void someMethod (Object x)
{
   if (x == null) throw new ArgumentNullException ();

   // more code...
}

我现在应该这样做:

public void myMethod (Object z)
{
    someMethod (z);
}

或者这个:

public void myMethod (Object z)
{
    if (z == null) throw new ArgumentNullException ();

    someMethod (z);
}

注意:我更喜欢这门课程的执行速度

3 个答案:

答案 0 :(得分:3)

在我看来,所有公共方法都应验证其输入,即使它有点多余。话虽如此,我经常使用条件编译指令编译更昂贵的验证和代码合同,以便发布版本只执行最关键的诊断和验证。

检查null参数是一项重要而且成本低廉的操作,它对数百万次调用的性能影响最小。

所有调用公共内部方法的重载方法可能会执行较少的检查,并知道它们的实际实现执行完全验证。

对于它的价值,我从微软看到的大多数BCL源代码都是在更多验证,诊断和合同遵守方面而不是更少。

答案 1 :(得分:0)

在我看来,如果传递给它的任何参数是someMethodnull应该负责抛出异常。理想情况下,如果somemethodmymethod,则不应从z致电null。您应该在myMethod中添加check for null,但让somemethod抛出异常

public void myMethod (Object z)
{
    someMethod (z);
}

我会建议上面的那个。顺便说一下,这些微观级别优化不会给你带来任何显着的性能提升

答案 2 :(得分:0)

我会这样做:

  • 如果你的方法对传入的参数有一定的要求(比如“一定不能为空”)那么它应该检查一下并在适当时抛出
  • 如果你的方法调用其他方法,它也不必检查他们的参数要求 - 无论如何,这是其他方法的工作。你只是复制代码 - 记住DRY(不要重复自己)

因此,在您的情况下,我不会再次检查myMethod中的空值,除非myMethod也依赖于z不是null。我怀疑是否存在任何实际相关的速度差异(请记住:“过早优化是所有邪恶的根源”)