首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullReferenceException对ArgumentNullException

NullReferenceException对ArgumentNullException
EN

Stack Overflow用户
提问于 2016-09-15 20:57:16
回答 3查看 7.1K关注 0票数 6

我读这个职位时,回答者提到他更喜欢ArgumentNullException而不是NullReferenceException

MSDN提到了NullReferenceException

当尝试取消引用空对象引用时引发的异常。

ArgumentNullException 他们上说:

当空引用( Visual中为Nothing)传递给不接受它为有效参数的方法时引发的异常。

答案似乎是说你可以用这两种方法。

有什么理由或情况下,我应该选择一个而不是另一个?

附注:

我知道这个问题可能是基于意见的。我想要的是事实、背景和情况。我对个人偏好不感兴趣。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-15 21:08:51

如果在代码中显式抛出异常,则应选择ArgumentNullException

当取消空引用/指针时,CLR会自动抛出NullReferenceException

代码语言:javascript
复制
unsafe
{
    int* ptr = null; // Null pointer.
    int val = *ptr; // NullReferenceException thrown.
}

在对空引用调用方法或属性时,最常见的情况是:

代码语言:javascript
复制
string text = null;
string substring = text.Substring(0, 2); // NullReferenceException thrown.

在大多数情况下,不应该在代码中显式抛出NullReferenceException

ArgumentNullException用于检查空引用作为参数传递的情况,通常用于防止NullReferenceException

代码语言:javascript
复制
static string FirstTwo(string value)
{
    if (value == null)
    {
        throw new ArgumentNullException(nameof(value));
    }
    return value.Substring(0, 2); // without the original check, this line would throw a NullReferenceException if value were null.
}

此检查的目的是让调用者清楚地知道null已经通过,null是不允许的。否则,如果简单地让NullReferenceException被抛出,调用方只会看到

对象引用未设置为对象的实例

它没有这样有意义(当使用检查时):

值不能为空。参数名称:值

票数 18
EN

Stack Overflow用户

发布于 2016-09-15 21:17:53

NullReferenceException从来不会被约定故意抛出。这意味着无意中违反了先遣队。因此,它几乎总是发出bug的信号。错误在抛出异常的代码中。

按照惯例,所有的NullReferenceException都应该被视为bug。其中99%是真正的虫子。1%不是真正的but,但值得花时间来防止它们,并抛出更有意义的异常类型来维护约定。

使用Argument*Exception发出拒绝传递的参数的信号。NullReferenceException意味着抛出此异常的代码的程序员犯了错误。

NullReferenceException视为运行时提供的失败断言。Argument*Exception的意思是“我想到了这个案子,我有意识地拒绝了它。”

票数 4
EN

Stack Overflow用户

发布于 2016-09-15 21:14:52

即使框架扩展方法看起来像抛出一个NullReferenceException,而不是抛出ArgumentNullExceptions

代码语言:javascript
复制
List<string> list = null;
var results = list.Select(x => x); //ArgumentNullException

只看代码(而且事先不知道Select是一种扩展方法),就应该抛出一个NullReferenceException.如果框架没有在这种情况下抛出它们,我将始终坚持使用ArgumentNullException

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39520241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档