C# 为什么不抛出异常呢?

C# 为什么不抛出异常呢?,c#,exception,C#,Exception,我刚刚读到,我不应该在自己的源代码中抛出ArgumentNullException。为什么会这样 如果我有一个不应该传递的方法null,为什么不检查参数并抛出它是否确实为null public void DoStuff(List<Int32> list) // Shouldn't be null. { if(list == null) // If input is null... throw new ArgumentNullException();

我刚刚读到,我不应该在自己的源代码中抛出
ArgumentNullException
。为什么会这样

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

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

   ...
}
public void DoStuff(列表)//不应为空。
{
if(list==null)//如果输入为null。。。
抛出新ArgumentNullException();
...
}

谢谢。

你当然应该。事件您自己的链接将此示例作为第一个示例。如果方法是公共的,则应始终检查参数的有效性


该链接仅讨论NullReferenceException,并且仅当您尝试访问null引用对象的方法时才会发生这种情况。不抛出NullReferenceException是正确的,因为它们只由运行时抛出。

抛出ArgumentNullException没有什么错,这是一个很好的实践


这篇文章讨论的是System.Exception、System.SystemException、System.NullReferenceException或System.IndexOutOfRangeException

该引用没有提到任何此类内容(我在该页上找不到ArgumentNullException)。它并没有说不要抛出NullReferenceException,这是一个完全不同的异常,实际上不应该从您自己的代码中抛出(您没有理由这样做)

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

因为如果抛出*NullReferenceException*,这意味着您预期其中一个对象可能会有一个对自身的空引用。最好通过将逻辑编程到代码中来处理这个问题,而不是依赖异常来处理它


作为普通执行的一部分,不应使用异常来更改程序流。它们只能用于报告和处理错误情况。

如果可以为空参数使用默认值,并且只要清楚地记录了默认值,则可能值得考虑该选项


但是,您应该始终验证公共方法中的任何参数。不要相信其他开发者知道他们在做什么。由于无效参数而引发的任何异常都应该继承自
ArgumentException
类。

它在哪里说不应该引发ArgumentNullException?我所能看到的是:“不要故意从您自己的源代码中抛出System.Exception、System.SystemException、System.NullReferenceException或System.IndexOutOfRangeException。”您可能希望使用System.Object.ReferenceEquals方法检查null。这是因为派生类可以重载“==”运算符。@James:运算符是在具体类中静态定义的。他们没有虚拟化的概念。如果List的子类定义了新的运算符,它们在这里就不可见了。不知道为什么这个问题有这么多的反对票。我认为投票制度被误解了。只有当问题令人困惑或做得不好时才投反对票。当这个问题以错误的假设开始时,它是一个非常明显的事件。@SoMoS-你自己说的,作者做出了错误的假设,这就是我投反对票的原因。显式检查null的好处是你显式检查并强制执行函数约定:调用方可能不会通过null。在这种情况下,通常期望引发的异常是ArgumentNullException。允许由于未检查而引发NullReferenceException更接近于公开实现细节。(如果不允许null,但代码不会崩溃,然后未来的维护人员添加会导致引发NullReferenceException的代码?或者反之亦然?最好显式地强制执行它,这样就清楚了。)关于混乱,您应该看看Microsoft自己的.NET框架中的生产级代码。(使用Reflector进行反编译,或者直接从Microsoft下载源代码)。我经常看到每一个参数都经过仔细验证。有时,大多数函数似乎都是由参数验证组成的,而不是“实际”工作@supercat“但是添加显式检查似乎会使代码变得混乱,也会减慢主线的速度。”强制执行方法的契约并不混乱(例如,您实际上可以使用代码契约将检查移出主实现)。至于你的性能问题,我真的不在乎你的方法有多快,如果它在获得它无法处理的数据的那一刻就轰炸你的方法。@supercat合同不是什么可以扔或不可以扔的东西;这是对调用方的一项要求,调用方必须遵守该要求,方法才能完成其职责。不同之处在于,一个函数明确指出是调用方的错误(通过调用该方法将为null),后者则让调用方猜测(调用是否为null,或者该方法是否存在缺陷)。我不明白你的机缘问题;作为开发人员,我们期望计算机在相同的输入条件下可靠地以相同的方式运行,因为您的大多数论证都没有意义;任何异常之间都没有功能上的区别,是我们与它们关联的语义提供了值。我认为框架中出现的一些NRE不应该自动地作为预期行为进行干预;更有可能是疏忽。