Проверка на ноль в конструкторе - PullRequest
10 голосов
/ 25 января 2011

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

public MyConstructor(Object myObject)
{
    if (myObject == null)
        throw new ArgumentNullException("myObject is null.");
    _myObject = myObject;
}

Эта проверка практически не нужна.Но я думаю, это потому, что я не совсем понимаю, в чем преимущества этой проверки.Кажется, что исключение нулевой ссылки будет выброшено в любом случае?Я, наверное, неправ, очень хотел бы услышать некоторые мысли по этому поводу.

Спасибо.

Ответы [ 8 ]

20 голосов
/ 25 января 2011

Для компилятора null является допустимым аргументом конструктора.

Ваш класс может обрабатывать нулевое значение для myObject.Но если он не может - если ваш класс сломается, когда myObject будет нулевым - тогда проверка в конструкторе позволит вам быстро потерпеть неудачу .

3 голосов
/ 25 января 2011

Передача объекта null совершенно законна во многих случаях - для этого класса разработчик хочет убедиться, что вы не можете создать экземпляр класса без передачи действительного экземпляра Object, поэтому необходимопозже никаких проверок - это хорошая практика, чтобы гарантировать это как можно раньше, что будет в конструкторе.

2 голосов
/ 25 января 2011

если вам меньше 4.0, вы можете сделать следующее:

 public ctor(IEnjection ninjaWeapon) 
 {
     Contract.Requires<ArgumentNullException>(ninjaWeapon != null);
     this.deadlyWeaponary.Add(ninjaWeapon);
 }

Если вы используете более старую версию, обратитесь к Microsoft.Contract для выполнения того же действия.

1 голос
/ 25 января 2011

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

1 голос
/ 25 января 2011

Я думаю, что вообще невозможно определить, нужна ли проверка на нулевое значение или нет. Это скорее зависит от того, можете ли вы жить с нулевыми переменными или нет. Ноль не является плохим состоянием. Могут возникнуть ситуации, когда допустимо, чтобы переменная была нулевой, а в других - нет.

Спросите себя, имеет ли смысл разрешать нулевые значения или нет, и проектируйте конструктор соответствующим образом.

1 голос
/ 25 января 2011

Компилятор не знает о значении объекта, поэтому вы должны проверить это во время выполнения, чтобы убедиться, что он не вызывается с нулевым значением.

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

0 голосов
/ 25 января 2011

Преимущество состоит в том, что исключение будет сгенерировано во время создания объекта, так что вы можете легко отследить, какая часть кода является виновником.Если вашему коду требуется ненулевое значение myobject, и вы не проверяете его в конструкторе, при использовании myObject_ будет выброшено NullReferenceException, и вам придется отслеживать вручную, чтобы увидеть, кто отправил это нулевое значениев.

0 голосов
/ 25 января 2011

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

...