2016-01-17 3 views
0

Я пишу небольшой lib расширения метода.Что выбрать ArgumentNullException или NullReferenceException

Например, мы имеем метод расширения

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

Какое исключение ArgumentNullException или NullReferenceException будет ясным для случая, когда коллекция равна нулю? Или что-то другое?

ответ

5

Это аргумент, который является недействительным, так что вы должны бросить ArgumentNullException. Вы должны в принципе никогда не бросать NullReferenceException напрямую - его нужно только бросать (автоматически), когда вы пытаетесь разыменовать нулевое значение.

Тот факт, что вы пишете метод расширения, не меняет того факта, что на самом деле это статический метод, а параметр collection - это параметр.

Как обычно, указать имя параметра, который является пустым, используя nameof если вы используете C# 6:

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

(Как и в сторону, проверить MoreLINQ, которые вполне могут иметь большую часть вашего методы уже ...)

+0

ПодробнееLINQ выглядит великолепно, спасибо) – Mitklantekutli

3

Вы никогда не должны бросать NullReferenceException. Это исключение генерируется каркасом, если вы пытаетесь получить доступ к объекту, который имеет значение null.

Se Вы должны бросить ArgumentNullException так:

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