Проверка Null в конструкторе
Я действительно пытаюсь выяснить, лучшие практики для многоразовый код, который легко отладить. Я столкнулся с распространенной практикой среди разработчиков, которую я еще не совсем понимаю.
public MyConstructor(Object myObject)
{
if (myObject == null)
throw new ArgumentNullException("myObject is null.");
_myObject = myObject;
}
кажется почти ненужным делать эту проверку. Но я думаю, это потому, что я не совсем понимаю, в чем преимущества этой проверки. Похоже, что исключение null reference будет выброшено в любом случае? Я, вероятно, ошибаюсь, действительно хотел бы услышать некоторые мысли он.
спасибо.
8 ответов
компилятору,null
является законным аргументом конструктора.
ваш класс может обрабатывать нулевое значение для myObject
. Но если это невозможно - если ваш класс сломается, когда myObject
равно null - тогда проверка в конструкторе позволяет не быстро.
передает null
объект во многих случаях является абсолютно законным - для этого класса разработчик хочет убедиться, что вы не можете создать экземпляр класса без передачи действительного Object
экземпляр, поэтому позже не должно быть никаких проверок - это хорошая практика, чтобы обеспечить это как можно раньше, что было бы в конструкторе.
Если вы под 4.0 вы можете сделать следующее:
public ctor(IEnjection ninjaWeapon)
{
Contract.Requires<ArgumentNullException>(ninjaWeapon != null);
this.deadlyWeaponary.Add(ninjaWeapon);
}
Если вы в более старой версии, обратитесь к Microsoft.Контракт на то же самое.
компилятор понятия не имеет о значении объекта, поэтому вы должны проверить это во время выполнения, чтобы убедиться, что он не вызывается с нулевым значением.
Это также зависит от вашего конкретного решения. Вам не нужно бросать исключение, я бы только бросил его, если вы не можете иметь это значение null, и если оно равно null, это исключительный случай.
Я думаю, что вообще невозможно сказать, нужна ли проверка на null или нет. Это скорее зависит от того, можете ли вы жить с нулевыми переменными или нет. Null не является плохим состоянием. У вас могут быть ситуации, когда для переменной разрешено значение null и другие, где это не так.
спросите себя, имеет ли смысл разрешать значения null или нет и соответствующим образом проектировать конструктор.
вы должны явно проверять на null, потому что компилятор не знает, но и потому, что null может быть аргументом.
благо, что исключение будет выброшено во время строительства объекта, так что вы можете легко проследить, какая часть кода является виновником. Если ваш код требует non-null myobject
значение, и вы не проверяете его в конструкторе,NullReferenceException
будет брошен, когда вы используете myObject_
и вам придется отследить вручную, чтобы увидеть, кто отправил это значение null.