在空实例上调用扩展方法(扩展方法不允许)时,您认为抛出的最佳异常类型是什么?由于扩展方法只不过是静态方法,您可能会认为它应该是 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/