Обнуляемые Ссылочные Типы в C# 8
Иногда
null является приемлемым значением для ссылочных типов, но часто это недопустимое значение, которое приводит к ArgumentNullException и NullReferenceException. C# 8 даёт нам возможность выразить, может ли ссылочная переменная быть null. Основываясь на этих аннотациях, компилятор предупредит вас, когда вы потенциально используете пустую ссылку или передаёте пустую ссылку в функцию, которая не может принимать null.Чтобы включить эту функцию, необходимо добавить следующую строку в
PropertyGroup файла проекта (.csproj):<Nullable>enable</Nullable>Для обозначения типов, допускающих
null, используется тот же символ ?, как и для обнуляемых значимых типов.MyClass? mayBeNull = null;Также можно использовать оператор null-объединения:
MyClass mayNotBeNull = new MyClass();
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/