2012-03-05 4 views
0

Давайте предположим, что я пишу публичный API в C#:Nullable параметра проверка

public void Method(object param) 
{ 
    if(param == null) 
    { 
     throw new ArgumentNullException("Specified 'param' can not be null"); 
    } 

// ... other business logic 
} 

Интересно, есть ли какие-либо гарантии того, что мне не нужно, чтобы проверить параметр для нулевой значения, если у меня есть НЕ обнуляемых параметра (объект? Param) как метод параметр? Другими словами, выше пример проверки на null избыточный?

+0

Пожалуйста, не прикрепите свои заголовки к «C#» и тому подобное. Для этого нужны теги. –

+1

Кроме того, вы можете использовать конструктор 'ArgumentNullException', который принимает два параметра' string': 'paramName' и' message'. – HABO

ответ

1

Нет, ссылочные типы всегда имеют значение NULL. Просто попробуйте: позвоните Method(null);, и вы получите рабочую среду ArgumentNullException, где именно вы ее бросите в код. Вы не получаете ошибку компилятора, так как null является допустимым значением для ссылочных типов.

Для типов значений это совсем другая история. Если у вас есть параметр типа int, он не может быть пустым. Фактически, if (i == null) даже не будет принят компилятором.

1

Если ваш параметр напечатан для ссылочного типа, то всегда можно передать null в качестве значения. Следовательно, эта проверка, когда только рассмотрение Method никогда не бывает излишним.

Невозможно использовать контекстно-определенный анализ данного метода для определения null. Например

sealed class Example { 
    void Method(object p) { 
    ... 
    } 
    void Other() { 
    Method("hello"); 
    } 
} 

В этом конкретном контексте вы можете продемонстрировать, что Method никогда не может быть вызван со значением null (за исключением призыва на основе конечно отражения). Но этот тип определения может быть выполнен только с использованием контекстно-специфического анализа

0

Если это избыточно или нет, не может быть определено в рамках этого единственного метода, но внутри вашей программы домена. Где этот метод использовался? Что он должен делать? Что должно произойти в программе, когда он не работает?

Отвечая на этот вопрос, вы окажетесь самим собой.

0

Это не избыточно, потому что переменная типа object может быть установлена ​​в нуль, поскольку это ссылочный тип. Тип object? не существует.

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