2009-11-16 4 views
1

Можно создать дубликат:
ArgumentNullException or NullReferenceException from extension method?Проверка входных параметров по методу расширения

Какое исключение должно быть брошено здесь?

public static string DoStuff(this Control control) 
{ 
    if (control == null) 
    { 
     throw new ArgumentNullException(); 
    } 

    // Code goes here... 
} 

Я думал о следующем:

  1. ArgumentNullException (используется ниже)
  2. InvalidOperationException
  3. NullReferenceException

Мой выбор был бы ArgumentNullException. Это верно?

+0

Действительно ли это необходимо? –

+0

Да, следующие работы/сбои, как шарм: Control c = null; c.DoStuff(). И в этом случае вы хотите иметь хорошее исключение. По крайней мере, мы это делаем. ;-) Все зависит от того, что я думаю. – Florian

ответ

4

Да, ArgumentNullException это правильная вещь здесь IMO. Это все еще аргумент, даже если он может использоваться как метод расширения.

В частности, это то, что делает LINQ to Objects, например. с the Select method (и все остальные методы Enumerable). Я говорю, следуйте примеру Microsoft.

EDIT: Я только что заметил, что это дубликат this question с ответом Джареда Парсонса. К счастью, этот ответ согласен с моим;)

0

Я бы выбрал исключение NullReferenceException, потому что это то, что выбрал бы обычный метод экземпляра. Я хочу, чтобы мои методы расширения воспринимались как обычные методы экземпляра.

+0

Привет, Максимилиан, спасибо за ваш быстрый ответ. Я предпочитаю придерживаться Microsoft. И поэтому предпочитайте ответ Джона. – Florian

+0

Я думаю, что слышал, что исключения, такие как 'NullReferenceException' и' StackOverflowException', больше не будут внедряться в .NET 4. – JulianR

+0

@Julian: Они бросаются. Вещь, которая изменяется в .Net 4, заключается в том, что без специального атрибута, применяемого к методу, метод не сможет поймать исключения, такие как StackOverflowException или OutOfMemoryException. –

Смежные вопросы