Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

<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);

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2