Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时检查空参数并引发ArgumentNullException_C# - Fatal编程技术网

C# 何时检查空参数并引发ArgumentNullException

C# 何时检查空参数并引发ArgumentNullException,c#,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

我有一些这样的代码:

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);
}

注意:我更喜欢这个类的执行速度

在我看来
someMethod
应该负责在传递给它的任何参数为
null
时引发异常。理想情况下,如果
z
null
,则不应从
mymethod
调用
somemethod
。您应该在
myMethod
中添加null检查,但是让
somemethod
抛出异常

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

我建议采用上述方法。顺便说一句,这些微观层次的优化不会给您带来任何显著的性能提升

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

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

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

值得一提的是,我从微软看到的大多数BCL源代码都在更多的验证、诊断和合同遵守方面出错,而不是更少。

我会这样说:

  • 如果您的方法对传入的参数有某些要求(如“不得为null”),那么它应该检查该要求并在适当时抛出
  • 如果您的方法调用其他方法,则不必检查它们的参数要求——无论如何,这是其他方法的工作。您只是在复制代码-请记住不要重复(不要重复自己)

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

但如果这种微观优化没有产生任何效果,那么下面这句话会更有用吗?我告诉你这个参数是错误的,第二个告诉你只有内部调用是错误的,小型公共方法应该验证它们的输入;这应该得到更多的强调。真正的问题是为什么问题中显示的两种方法都需要公开。大多数时候,他们没有。@CodyGray-我错了,我无意中改写了你的编辑。我同意仔细选择哪些方法实际上需要公开。在我看来,该方法的副作用也对所需的验证有重大影响。如果一个方法有可能损坏/丢失持久数据或中断一个重要的用户事务,那么它的输入应该在所有级别(权限、参数有效性、前/后状态等)上进行严格验证,而不考虑这样做的开销。所有方法都是公共的,我发现如下情况:问题已解决。@user1109215-是,代码分析规则非常适合回答和解释这样的问题。您可以在VisualStudio项目属性中编译时使它们运行(如果您还不知道的话)。