Обнуляемая проверка параметров - PullRequest
0 голосов
/ 05 марта 2012

Предположим, я пишу публичный API на C #:

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

// ... other business logic
}

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

Ответы [ 4 ]

1 голос
/ 05 марта 2012

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

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

1 голос
/ 05 марта 2012

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

Для конкретного контекстного анализа данного метода возможно доказать, что null никогда не используется.Например,

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

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

0 голосов
/ 05 марта 2012

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

0 голосов
/ 05 марта 2012

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

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

...