.net - 扩展方法中的 ArgumentNullException 或 NullReferenceException?

标签 .net exception extension-methods

在空实例上调用扩展方法(扩展方法不允许)时,您认为抛出的最佳异常类型是什么?由于扩展方法只不过是静态方法,您可能会认为它应该是 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,因为在该方法将要使用的大多数地方它似乎更自然使用过。

最佳答案

一般来说,包括异常(exception)情况,您应该将扩展方法视为普通的静态方法。在这种情况下,您应该抛出 ArgumentNullException。

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

  • 空引用实际上并未发生,因此看到空引用是违反直觉的
  • 抛出 NullReferenceException 并导致 NullReferenceException 发生会产生明显不同的异常(查看差异的一种方法是错误代码)。 CLR 引发的许多异常都是如此。

参见When can you catch a StackOverflowException (我就这个主题发表过一篇文章)。

  • 像调用常规方法一样调用扩展方法是完全合法的。在这种情况下,我当然不会排除 NullReferenceException,而是排除 ArgumentNullException。

关于.net - 扩展方法中的 ArgumentNullException 或 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/463302/

相关文章:

.net - 为什么在创建 X509Certificate2 对象时会收到拒绝访问错误?

c# - 测试sql连接而不抛出异常

c# - 读取文件时出现 OutOfMemoryException

linq - IQueryable(非通用): missing Count and Skip ?与IQueryable <T>一起使用

kotlin - 调用接口(interface)中声明的接收器函数

c# - 如何在不完全阻塞线程的情况下将线程池中的线程暂停执行一定时间?

python - 将函数传递给类

c# - 为什么静态类不能实现接口(interface)?

java - 无法捕获有关音频剪辑的异常

c# - 使用创建的扩展方法