当前位置:  开发笔记 > 编程语言 > 正文

扩展方法的ArgumentNullException或NullReferenceException?

如何解决《扩展方法的ArgumentNullException或NullReferenceException?》经验,为你挑选了3个好方法。

在null实例(扩展方法不允许)的情况下调用扩展方法时,您认为是最好的异常类型是什么?由于扩展方法只不过是静态方法,你可以说它应该是ArgumentNullException,但另一方面它们像实例方法一样使用,因此使用NullReferenceException可能更自然.我们来看下面的例子:

public static string ToInvariantString(this IFormattable value, string format)
{
    return value.ToString(format, CultureInfo.InvariantCulture);
}

这样,如果value参数为null,则抛出NullReferenceException.

另一个例子是:

public static string ToInvariantString(this IFormattable value, string format)
{
    if (value == null) throw new ArgumentNullException("value");
    return value.ToString(format, CultureInfo.InvariantCulture);
}

编辑: 在一些答案中,你已经指出扩展方法可以像静态方法一样调用,在这种情况下,空引用异常会出错,这是一个很好的观点,实际上是我关注的一个问题,不知道为什么我忘了首先在问题中提到这一点.

有人还指出抛出NullReferenceException是错误的,是的,确实如此.这就是为什么我不扔它,我只是让它发生(让CLR抛出它)不守护方法.

我认为我赞成ArgumentNullException(这是我到目前为止所使用的)但我仍然认为至少有空间来反对NullReferenceException,因为在大多数将要使用该方法的地方看起来更自然.



1> JaredPar..:

通常,包括异常,您应该将扩展方法视为常规静态方法.在这种情况下,您应该抛出ArgumentNullException.

由于一些原因,在这里抛出NullReferenceException是一个坏主意

实际上没有出现空引用,因此看到一个是违反直觉的

抛出NullReferenceException并导致NullReferenceException发生会产生可辨别的不同异常(查看差异的一种方法是错误代码).CLR抛出的许多异常都是如此.

请参阅何时可以捕获StackOverflowException(我在此主题上发表的帖子).

调用扩展方法就像是常规方法一样,这是完全合法的.在那种情况下,除了NullReferenceException之外我肯定不会,而是ArgumentNullException.



2> Jon Skeet..:

除了所有其他答案(这些都是好的)之外,我认为值得看一下微软为了一致性而做了什么......而且就我所见,Enumerable中的扩展方法都抛出了ArgumentNullException.



3> casperOne..:

由于扩展方法可以在C#2.0中使用,并且可以像静态方法一样调用它们(您不必将它们用作扩展方法),您应该使用ArgumentNullException.

仅仅因为它们看起来像类型上的方法并不意味着它们是,或者总是被称为一个.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有