Csharp/C#教程:扩展方法的ArgumentNullException或NullReferenceException?分享


扩展方法的ArgumentNullException或NullReferenceException?

在null实例(扩展方法不允许)的情况下调用扩展方法时,您认为最好的exception类型是什么? 由于扩展方法只是静态方法,你可以说它应该是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); } 

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

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

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

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

出于一些原因,抛出NullReferenceException是一个坏主意

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

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

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

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

从用户的角度来看,该方法看起来像一个实例方法,所以如果我是他们,我希望看到一个NullReferenceException。

也就是说,我建议在代码中明确地抛出一个或另一个,而不是像在第一个例子中那样“发生”抛出一个。

ArgumentNullException。 没有要求将扩展方法称为实例方法。 您可以将它们称为正常方法。 在这种情况下,NullReferenceException完全不正确。

上述就是C#学习教程:扩展方法的ArgumentNullException或NullReferenceException?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1029287.html

(0)
上一篇 2022年1月12日
下一篇 2022年1月12日

精彩推荐