C #: лучшие практики для проверки аргумента "this" в методах расширения - PullRequest
6 голосов
/ 25 апреля 2009

Допустим, у меня есть метод расширения

public static T TakeRandom<T>(this IEnumerable<T> e)
{
    ...

Чтобы подтвердить аргумент e, я должен:

A) if (e == null) генерировать новое исключение NullReferenceException ()
B) если (e == null) генерирует новое ArgumentNullException ("e")
В) не проверять е

Какой консенсус?

Моя первая мысль - всегда проверять аргументы, поэтому выдается исключение ArgumentNullException. Опять же, поскольку TakeRandom () становится методом e, возможно, это должно быть исключение NullReferenceException. Но если это NullReferenceException, если я пытаюсь использовать член e внутри TakeRandom (), NullReferenceException все равно будет выброшено.

Может быть, мне лучше использовать Reflector и узнать, что делает фреймворк.

Ответы [ 3 ]

10 голосов
/ 25 апреля 2009

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

Не забывайте, что методы расширения - это просто статические методы, которые могут быть вызваны как таковые. Хотя на первый взгляд может показаться целесообразным выдавать исключение NullReferenceException в методе расширения, в статическом методе это не имеет смысла. Невозможно определить соглашение о вызовах в методе, и поэтому ArgumentException является лучшим выбором.

Кроме того, вы никогда не должны явно генерировать исключение NullReferenceException. Это должно быть брошено только CLR. Существуют тонкие различия, возникающие при явном генерировании исключений, которые обычно генерируются только CLR.

Это также близко к обману следующего

4 голосов
/ 25 апреля 2009

Для согласованности с операторами Enumerable LINQ выведите исключение ArgumentNullException (не NullReferenceException).

Я бы сделал проверку в методе TakeRandom, потому что трассировка стека прояснит, что именно TakeRandom возражает против того, чтобы получить нулевой аргумент.

1 голос
/ 25 апреля 2009

Может быть, я сумасшедший, но так как это аргумент, я бы выбросил ArgumentNullException: /

Общее практическое правило заключается в том, чтобы по возможности генерировать исключения, производные от System.ApplicationException. NullReferenceException - это то, что фреймворк / CLR будет выдавать.

http://msdn.microsoft.com/en-us/library/system.exception(VS.71).aspx

Существуют две категории исключений под базовый класс Исключение:

Предопределенный общий язык классы исключений во время выполнения, полученные из SystemException. Пользовательский классы исключений приложений из ApplicationException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...