Как определить, является ли ссылка на объект нулевой в C# без выдачи исключения, если она равна нулю?
т.е. если мне передается ссылка на класс, и я не знаю, имеет ли она значение NULL или нет.





(YourObject != Null)
можно сравнить с нулем?
Если он равен нулю, вместо того, чтобы генерировать исключение, вы можете инициализировать свой объект. Вы можете использовать шаблон Null.
тестирование на null никогда не * вызовет исключение
void DoSomething( MyClass value )
{
if ( value != null )
{
value.Method();
}
}
* никогда как в Никогда не следует. Как указывает @Ilya Ryzhenkov, реализация неверный оператора! = Для MyClass может вызвать исключение. К счастью, у Грега Бича есть хорошая запись в блоге на реализация равенства объектов в .NET.
Есть по крайней мере один способ выбросить: theObj.Equals( null).
or if (value == null) Спасибо!
@Mike B. Технически это не тестирование на null, а вызов метода Equals () для объекта Obj, который, как вы говорите, вызовет исключение, если ссылка Obj имеет значение null.
Или, если вы используете типы значений, вы можете прочитать о типах, допускающих значение NULL: http://www.c-sharpcorner.com/UploadFile/mosessaur/nullabletypes08222006164135PM/nullabletypes.aspx
То, что сказал Роберт, но в этом конкретном случае мне нравится выражать это с помощью защитного предложения вроде этого, а не вкладывать все тело метода в блок if:
void DoSomething( MyClass value )
{
if ( value == null ) return;
// I might throw an ArgumentNullException here, instead
value.Method();
}
Я думаю, вы имеете в виду «значение == ноль». Вызов value.Method () для нулевого объекта был бы плохим.
Да, вот что я получаю за копирование / вставку. Исправлено сейчас.
> Я мог бы создать исключение и здесь: если это так, вероятно, сгенерируйте новое исключение ArgumentNullException ("значение");
Мне нужен был способ установить значение или поведение по умолчанию, если класс был нулевым. Я хотел избежать исключения, так как точно знал, что хочу делать. Спасибо, это то, что я искал.
if (p != null)
{
DoWork(p);
}
Кроме того, ключевое слово as полезно, если вы хотите определить, относится ли класс к правильному типу, и использовать его все сразу.
IExample e = p as IExample;
if (e != null)
DoWork(e);
В приведенном выше примере, если вы использовали e как (IExample) e, это вызовет исключение, если e не реализует IExapmle. Если вы используете as, а e не реализует IExample, e будет просто нулевым.
Если вы используете ключевое слово «as», можно также добавить «is»: if (p is IExample) {DoWork (p as IExample)} as «is» будет оценивать значение false, если p равно null.
Если вы используете is, вам следует просто выполнить прямое приведение после этого вместо as, поскольку as добавит дополнительную ненужную проверку на null.
У меня есть определение производного приложения xaml.cs приложения:
private SortedList myList;
И я хочу иметь возможность повторно использовать свои конструкторы. Итак, мне понадобились:
if ( myList == null)
myList = new SortedList();
Спасибо, Роберт!
Обратите внимание, что наличие оператора! =, Определенного в MyClass, вероятно, приведет к другому результату проверки и NullReferenceException позже. Чтобы быть абсолютно уверенным, используйте object.ReferenceEquals (value, null)
Это придирчиво, но я всегда кодирую это как ...
if (null == obj) {
obj = new Obj();
}
вместо
if (obj == null) {
obj = new Obj();
}
чтобы избежать случайного написания
if (obj = null) {
obj = new Obj();
}
потому что
if (null = obj) {
obj = new Obj();
}
выдаст вам ошибку компилятора
if (obj = null) выдает предупреждение компилятора "возможное неправильное использование ="
В C# выражение вашего условия должно быть логическим, а obj = null никогда не будет (с другой стороны, obj = true). Код Yoda не рекомендуется в C#.
Если вы посмотрите на большую часть исходного кода .NET framework, вы увидите, что они помещают подобные проверки в начало своих функций.
public void DoSomething(Object myParam)
{
if (myParam == null) throw new ArgumentNullException("myParam");
// Carry on
}
Хороший совет для общедоступного интерфейса, в котором пустая ссылка недопустима в контексте вызываемого метода.
В C# 6.0 это намного элегантнее; вы можете сделать это одной строкой :-)
value?.Method();
Если «значение» равно нулю, ничего не произойдет - и никаких исключений.
fyi - видео YouTube с примером кода для шаблона Null youtube.com/watch?v=hp1Y9bhail8