TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.78K subscribers
Post #1061 1.49K
День восемьсот шестьдесят девятый. #ЗаметкиНаПолях
Различные Способы Проверки на Null в C#
В .NET существует несколько способов проверки на null. Но не все они равнозначны. Рассмотрим различные способы проверки:
object obj = ...;

// Основные проверки
obj == null;
object.Equals(obj, null);
object.ReferenceEquals(obj, null);

// Аналогичны ReferenceEquals(obj, null)
obj is null;
(object)obj == null;

// Аналогичны !ReferenceEquals(obj, null)
obj is not object;
obj is not {};

// Не работает, выдаёт NullReferenceException
obj.Equals(null);

Есть 3 основных способа:
1. object.ReferenceEquals(obj, null)
ReferenceEquals возвращает true, если экземпляры объекта являются одним и тем же экземпляром. В этом случае он возвращает true, если obj имеет значение null.

2. object.Equals(obj, null)
Equals аналогичен ReferenceEquals, когда один аргумент имеет значение null. Однако логика этого метода сложнее, чем ReferenceEquals, и немного медленнее, поскольку вызов метода не всегда встраивается.

3. obj == null
Оператор == аналогичен ReferenceEquals, если вы не определяете оператор равенства для класса. Если оператор определён, компилятор использует его вместо оператора по умолчанию. В этом случае логика сравнения настраивается, и она может и не учитывать проверку на null. Вы можете заставить компилятор использовать оператор ==, определённый для object, путём явного преобразования объекта к object.

Заметьте, что is null не работает со структурами, кроме обнуляемых:
MyStruct a = default;

// Ошибка компиляции
_ = a is null;

// Работает, только если MyStruct
// определяет оператор ==
_= a == null;

Span<char> span = default;

// Ошибка компиляции
_ = span is null;

// Работает, т.к. Span определяет оператор ==
_ = span == null;

int? b = null;
// Аналогично !b.HasValue
_ = b is null;

Заметьте, что хотя сопоставления с образцом is not null, is object и is {} аналогичны одной и той же проверке на null (см. выше), использование их вместе с объявлением переменной различается:
// Ошибка компиляции
if (obj is not null x) { … }
// OK, х – типа object
if (obj is object x) { … }
// OK, x – того же типа, что и obj
if (obj is {} x) { … }

Источник: https://www.meziantou.net/null-check-in-csharp.htm
More from @netdeveloperdiary
  1. Oct 17, 2026День 2817. #ЧтоНовенького #VS Прекращаем Сборку После Первой Ошибки Мэдс Кристенсен продол…
  2. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  3. Oct 15, 2026Post #3374
  4. Oct 14, 2026Post #3373
  5. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  6. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →