选择什么ArgumentNullException或NullReferenceException

时间:2016-01-17 17:28:00

标签: c# .net

我正在编写一个方法扩展的小库。

例如我们有扩展方法

public static T GetRandom<T>(this IEnumerable<T> collection)

当collection为null时,哪个异常 ArgumentNullException NullReferenceException 最明显?或其他什么?

2 个答案:

答案 0 :(得分:5)

这是null的参数,所以你应该抛出ArgumentNullException。你基本上不应该直接抛出NullReferenceException - 它只会在你试图取消引用空值时被自动抛出。

您正在编写扩展方法这一事实并未改变这样一个事实:它确实是一个静态方法,而collection是一个参数。

像往常一样,如果您使用的是C#6,请使用nameof指定参数的名称为null:

public static T GetRandom<T>(this IEnumerable<T> collection)
{
    if (collection == null)
    {
        throw new ArgumentNullException(nameof(collection));
    }
    ...
}

(顺便说一句,请查看MoreLINQ,这可能已经包含了大部分方法......)

答案 1 :(得分:3)

你永远不应该抛出NullReferenceException。如果您尝试访问具有值null的对象,则会抛出此异常。

你需要像这样抛出ArgumentNullException

public static T GetRandom<T>(this IEnumerable<T> collection)
{
    if(collection == null)
        throw new ArgumentNullException("collection");
    //...
}