发布于 2016-09-15 21:08:51
如果在代码中显式抛出异常,则应选择ArgumentNullException。
当取消空引用/指针时,CLR会自动抛出NullReferenceException:
unsafe
{
int* ptr = null; // Null pointer.
int val = *ptr; // NullReferenceException thrown.
}在对空引用调用方法或属性时,最常见的情况是:
string text = null;
string substring = text.Substring(0, 2); // NullReferenceException thrown.在大多数情况下,不应该在代码中显式抛出NullReferenceException。
ArgumentNullException用于检查空引用作为参数传递的情况,通常用于防止NullReferenceException。
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被抛出,调用方只会看到
对象引用未设置为对象的实例
它没有这样有意义(当使用检查时):
值不能为空。参数名称:值
发布于 2016-09-15 21:17:53
NullReferenceException从来不会被约定故意抛出。这意味着无意中违反了先遣队。因此,它几乎总是发出bug的信号。错误在抛出异常的代码中。
按照惯例,所有的NullReferenceException都应该被视为bug。其中99%是真正的虫子。1%不是真正的but,但值得花时间来防止它们,并抛出更有意义的异常类型来维护约定。
使用Argument*Exception发出拒绝传递的参数的信号。NullReferenceException意味着抛出此异常的代码的程序员犯了错误。
将NullReferenceException视为运行时提供的失败断言。Argument*Exception的意思是“我想到了这个案子,我有意识地拒绝了它。”
发布于 2016-09-15 21:14:52
即使框架扩展方法看起来像抛出一个NullReferenceException,而不是抛出ArgumentNullExceptions。
List<string> list = null;
var results = list.Select(x => x); //ArgumentNullException只看代码(而且事先不知道Select是一种扩展方法),就应该抛出一个NullReferenceException.如果框架没有在这种情况下抛出它们,我将始终坚持使用ArgumentNullException
https://stackoverflow.com/questions/39520241
复制相似问题