Как определить пустую ссылку в C#?

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

т.е. если мне передается ссылка на класс, и я не знаю, имеет ли она значение NULL или нет.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
11 731
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

(YourObject != Null)

можно сравнить с нулем?

Если он равен нулю, вместо того, чтобы генерировать исключение, вы можете инициализировать свой объект. Вы можете использовать шаблон Null.

fyi - видео YouTube с примером кода для шаблона Null youtube.com/watch?v=hp1Y9bhail8

Robert Paulson 15.10.2008 00:35

тестирование на null никогда не * вызовет исключение

void DoSomething( MyClass value )
{
    if ( value != null )
    {
        value.Method();
    }
}

* никогда как в Никогда не следует. Как указывает @Ilya Ryzhenkov, реализация неверный оператора! = Для MyClass может вызвать исключение. К счастью, у Грега Бича есть хорошая запись в блоге на реализация равенства объектов в .NET.

Есть по крайней мере один способ выбросить: theObj.Equals( null).

Michael Burr 15.10.2008 00:26

or if (value == null) Спасибо!

Fred 15.10.2008 00:27

@Mike B. Технически это не тестирование на null, а вызов метода Equals () для объекта Obj, который, как вы говорите, вызовет исключение, если ссылка Obj имеет значение null.

Robert Paulson 15.10.2008 00:32

Или, если вы используете типы значений, вы можете прочитать о типах, допускающих значение 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 () для нулевого объекта был бы плохим.

justin.m.chase 15.10.2008 00:26

Да, вот что я получаю за копирование / вставку. Исправлено сейчас.

Joel Coehoorn 15.10.2008 00:32

> Я мог бы создать исключение и здесь: если это так, вероятно, сгенерируйте новое исключение ArgumentNullException ("значение");

Joe 15.10.2008 00:36

Мне нужен был способ установить значение или поведение по умолчанию, если класс был нулевым. Я хотел избежать исключения, так как точно знал, что хочу делать. Спасибо, это то, что я искал.

Fred 08.11.2016 01:23

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.

Colin Wiseman 19.10.2015 11:51

Если вы используете is, вам следует просто выполнить прямое приведение после этого вместо as, поскольку as добавит дополнительную ненужную проверку на null.

justin.m.chase 19.10.2015 16:23

У меня есть определение производного приложения 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) выдает предупреждение компилятора "возможное неправильное использование ="

Jimmy 15.10.2008 01:33

В C# выражение вашего условия должно быть логическим, а obj = null никогда не будет (с другой стороны, obj = true). Код Yoda не рекомендуется в C#.

justin.m.chase 24.06.2013 23:44

Если вы посмотрите на большую часть исходного кода .NET framework, вы увидите, что они помещают подобные проверки в начало своих функций.

public void DoSomething(Object myParam)
{
  if (myParam == null) throw new ArgumentNullException("myParam");

  // Carry on
}

Хороший совет для общедоступного интерфейса, в котором пустая ссылка недопустима в контексте вызываемого метода.

Robert Paulson 15.10.2008 01:02

В C# 6.0 это намного элегантнее; вы можете сделать это одной строкой :-)

value?.Method();

Если «значение» равно нулю, ничего не произойдет - и никаких исключений.

Другие вопросы по теме