c#为什么不抛出ArgumentNullException?

joh*_*ohn -2 c# exception

我刚刚在这里阅读,我不应该ArgumentNullException从我自己的源代码中抛出.为什么是这样?

如果我有一个不应该传递的方法null,为什么不检查参数并抛出它是否确实为空?

public void DoStuff(List<Int32> list)   // Shouldn't be null.
{
   if(list == null)   // If input is null...
      throw new ArgumentNullException();

   ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jam*_*ton 6

该引用没有说任何这样的事情(我找不到该页面上提到的ArgumentNullException).它确实说不抛出NullReferenceException,这是一个完全不同的异常,并且确实不应该从你自己的代码抛出(你没有理由).

我一直从我自己的代码中抛出ArgumentNullException,在检查参数时.NET Framework也是如此.

  • 关于混乱,您应该查看Microsoft自己的.NET Framework中的生产级代码.(使用Reflector进行反编译,或直接从Microsoft下载源代码).我经常看到每个参数都经过仔细验证.有时大多数功能似乎都包含参数验证 - 而不是"实际"工作! (2认同)
  • @supercat"但添加显式检查似乎会使代码混乱并且还会减慢主线情况." 执行方法的合同并不是混乱的(例如,您可以使用代码约定来将检查移出主实现).至于你的性能问题,我真的不在乎你的方法有多快,如果它轰炸它得到它无法处理的数据. (2认同)
  • @supercat合同不是可能抛出的,也可能不是抛出的; 它要求调用者必须遵守该方法以满足其责任.不同之处在于,一个清楚地表明它是调用者的错误(通过调用该方法将为null),后者调用者会猜测(调用可以为null,或者方法中是否存在缺陷).我不明白你的机会问题; 作为开发人员,我们希望计算机在相同输入的情况下可靠地表现相同的行为. (2认同)