оказывает влияние на весь проект. Для управления меньшими частями проекта используйте директиву компилятора
#nullable
, значения которой описаны в табл. 4.6.
Ссылочные типы, допускающие null, в действии
Во многом из-за важности изменения ошибки с типами, допускающими значение
null
, возникают только при их ненадлежащем применении. Добавьте в файл
Program.cs
следующий класс:
public class TestClass
{
public string Name { get; set; }
public int Age { get; set; }
}
Как видите, это просто нормальный класс. Возможность принятия значения
null
появляется при использовании данного класса в коде. Взгляните на показанные ниже объявления:
string? nullableString = null;
TestClass? myNullableClass = null;
Настройка в файле проекта помещает весь проект в контекст допустимости значения
null
, который разрешает применение объявлений типов
string
и
TestClass
с заметками о допустимости значения
null
(
?
). Следующая строка кода вызывает генерацию предупреждения (CS8600) из-за присваивания
null
типу, не допускающему значение
null
, в контексте допустимости значения
null
:
// Предупреждение CS8600 Converting null literal or possible null
// value to non-nullable type
// Преобразование литерала null или возможного значения null
// в тип, не допускающий null
TestClass myNonNullableClass = myNullableClass;
Для более точного управления тем, где в проекте находятся контексты допустимости значения
null
, с помощью директивы компилятора
#nullable
можно включать или отключать контекст (как обсуждалось ранее). В приведенном далее коде контекст допустимости значения
null
(установленный на уровне проекта) сначала отключается, после чего снова включается за счет восстановления настройки из файла проекта:
#nullable disable
TestClass anotherNullableClass = null;
// Предупреждение CS8632 The annotation for nullable reference types
// should only be used in code within a '#nullable' annotations
// Заметка для ссылочных типов, допускающих значение null,
// должна использоваться только в коде внутри
// #nullable enable annotations
TestClass? badDefinition = null;
//
Предупреждение CS8632 The annotation for nullable reference types
// should only be used in code within a '#nullable' annotations
// Заметка для ссылочных типов, допускающих значение null,
// должна использоваться только в коде внутри
#nullable enable annotations
string? anotherNullableString = null;
#nullable restore
В заключение важно отметить, что ссылочные типы, допускающие значение
null
, не имеют свойств
HasValue
и
Value
, т.к. они предоставляются
System.Nullable<T>
.
Рекомендации по переносу кода
Если при переносе кода из C# 7 в C# 8 или C# 9 вы хотите задействовать ссылочные типы, допускающие значение
null
, то можете использовать для работы с кодом комбинацию настройки проекта и директив компилятора. Общепринятая практика предусматривает первоначальное включение предупреждений и отключение заметок о допустимости значения
null
для всего проекта. Затем по мере приведения в порядок областей кода применяйте директивы компилятора для постепенного включения заметок.
Работа с типами, допускающими значение null
Для работы с типами, допускающими значение
null
, в языке C# предлагается несколько операций. В последующих разделах рассматриваются операция объединения с
null
, операция присваивания с объединением с
null
и
null
– условная операция. Для проработки примеров используйте ранее созданный проект
FunWithNullableValueTypes
.
Операция объединения с null
Следующий важный аспект связан с тем, что любая переменная, которая может иметь значение null (т.е. переменная ссылочного типа или переменная типа, допускающего
null
), может использоваться с операцией
??
языка С#, формально называемой операцией объединения с
null
. Операция
??
позволяет присваивать значение типу, допускающему
null
, если извлеченное значение на самом деле равно
null
. В рассматриваемом примере мы предположим, что в случае возвращения методом
GetlntFromDatabase
значения
null
(конечно, данный метод запрограммирован так, что он всегда возвращает
null
, но общую идею вы должны уловить) локальной переменной целочисленного типа, допускающего
null
, необходимо присвоить значение
100
. Возвратитесь к проекту
NullableValueTypes
(сделайте его стартовым) и введите следующий код:
// Для краткости код не показан
Console.WriteLine("***** Fun with Nullable Data *****\n");
DatabaseReader dr = new DatabaseReader;
// Если значение, возвращаемое из GetlntFromDatabase, равно
// null, тогда присвоить локальной переменной значение 100.
int myData = dr.GetIntFromDatabase ?? 100;
Console.WriteLine("Value of myData: {0}", myData);