TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #576 1.06K
День четыреста семьдесят третий. #ЗаметкиНаПолях
Обнуляемые Ссылочные Типы в C# 8
Иногда null является приемлемым значением для ссылочных типов, но часто это недопустимое значение, которое приводит к ArgumentNullException и NullReferenceException. C# 8 даёт нам возможность выразить, может ли ссылочная переменная быть null. Основываясь на этих аннотациях, компилятор предупредит вас, когда вы потенциально используете пустую ссылку или передаёте пустую ссылку в функцию, которая не может принимать null.

Чтобы включить эту функцию, необходимо добавить следующую строку в PropertyGroup файла проекта (.csproj):
<Nullable>enable</Nullable>

Для обозначения типов, допускающих null, используется тот же символ ?, как и для обнуляемых значимых типов.
MyClass? mayBeNull = null;
MyClass mayNotBeNull = new MyClass();
Также можно использовать оператор null-объединения:
mayNotBeNull = mayBeNull ?? new MyClass();

Компилятор не просто полагается на определение, он использует анализ потока, чтобы определить места в коде, где необнуляемой переменной можно безопасно присвоить значение. Например, следующий код не вызовет предупреждений:
if (mayBeNull == null)
throw new ArgumentNullException(nameof(mayBeNull));
mayNotBeNull = mayBeNull;

Но, если проверку убрать, компилятор выдаст предупреждение:
CS8600: Converting null literal or possible null value to non-nullable type. (Преобразование null или пустой ссылки в необнуляемый тип)

В случаях, когда компилятор не сможет выявить, что ссылка не допускает null, но вы уверены в безопасности кода, можно использовать «null-снисходительный» (null-forgiving) оператор ! (заметьте, что в отличие от оператора отрицания, он ставится после переменной, а не до):
Uri? uri = …;
string scheme = uri!.Scheme;
int port = uri.Port;

Т.к. мы использовали оператор !, компилятор знает, что это безопасно. Его уже не нужно использовать на следующей строке при обращении к свойству Port (компилятор делает вывод, что uri больше не может быть null).

Методам и аргументам можно добавить аннотации с помощью атрибутов из пространства имён System.Diagnostics.CodeAnalysis, чтобы помочь компилятору анализировать поток исполнения относительно обнуляемых типов. Базовые библиотеки .NET Core содержат эти атрибуты. Например:
public static bool IsNullOrEmpty([NotNullWhenAttribute(false)] string? value)
Такая аннотация сообщает компилятору, что, когда метод возвращает false, переменная, переданная в value, далее в коде не будет иметь значение null, даже при том, что она обнуляемого типа.
Эти атрибуты доступны в .NET Core 3.x, .NET Standard 2.1 и .NET 5.0.

Источник: https://developers.redhat.com/blog/2020/03/05/c-8-nullable-reference-types/
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
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 →