Шрифт:
Интервал:
Закладка:
Чтобы увидеть их в действии, создайте новый проект консольного приложения по имени FunWithNullableReferenceTypes. Откройте файл проекта (если вы используете Visual Studio, тогда дважды щелкните на имени проекта в окне Solution Explorer или щелкните правой кнопкой мыши на имени проекта и выберите в контекстном меню пункт Edit Project file (Редактировать файл проекта)). Модифицируйте содержимое файла проекта для поддержки ссылочных типов, допускающих null, за счет добавления элемента <Nullable> (все доступные варианты представлены в табл. 4.5).
<Project Sdk="Microsoft .NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Элемент <Nullable> оказывает влияние на весь проект. Для управления меньшими частями проекта используйте директиву компилятора #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);
Console.ReadLine();
Преимущество применения операции ?? заключается в том, что она дает более компактную версию кода, чем традиционный условный оператор if/else. Однако при желании можно было бы написать показанный ниже функционально эквивалентный код, который в случае возвращения null обеспечит установку переменной в значение 100:
// Более длинный код, в котором не используется синтаксис ??.
int? moreData = dr.GetIntFromDatabase();
if (!moreData.HasValue)
{
moreData = 100;
}
Console.WriteLine("Value of moreData: {0}", moreData);
// Вывод значения moreData
Операция присваивания с объединением с null (нововведение в версии 8.0)
В версии C# 8 появилась операция присваивания с объединением с null (??=), основанная на операции объединения с null. Эта операция выполняет присваивание левого операнда правому операнду, только если левый операнд равен null. В качестве примера введите такой код:
// Операция присваивания с объединением с null
int? nullableInt = null;
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин - Программирование
- Гибкое управление проектами и продуктами - Борис Вольфсон - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- От «Энигмы» до ChatGPT - Рустам Агамалиев - Программирование / Экономика
- Как почистить сканы книг и сделать книгу - IvanStorogev? KpNemo - Программирование