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

ЖАНРЫ

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

// Предупреждение 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;

nullableInt ??= 12;

nullableInt ??= 14;

Console.WriteLine(nullableInt);

Сначала переменная

nullableInt
инициализируется значением
null
. В следующей строке переменной
nullableInt
присваивается значение 12, поскольку левый операнд действительно равен
null
. Но в следующей за ней строке переменной
nullableInt
не присваивается значение 14, т.к. она не равна
null
.

null-условная операция

При разработке программного обеспечения обычно производится проверка на предмет

null
входных параметров, которым передаются значения, возвращаемые членами типов (методами, свойствами, индексаторами). Например, пусть имеется метод, который принимает в качестве единственного параметра строковый массив. В целях безопасности его желательно проверять на предмет
null
, прежде чем начинать обработку. Поступая подобным образом, мы не получим ошибку во время выполнения, если массив окажется пустым. Следующий код демонстрирует традиционный способ реализации такой проверки:

static void TesterMethod(string[] args)

{

// Перед доступом к данным массива мы должны проверить его

// на равенство null!

if (args != null)

{

Console.WriteLine($"You sent me {args.Length} arguments.");

// Вывод количества аргументов

}

}

Чтобы устранить обращение к свойству

Length
массива
string
в случае, когда он равен
null
, здесь используется условный оператор. Если вызывающий код не создаст массив данных и вызовет метод
TesterMethod
примерно так, как показано ниже, то никаких ошибок во время выполнения не возникнет:

TesterMethod(null);

В языке C# имеется маркер

null
– условной операции (знак вопроса, находящийся после типа переменной, но перед операцией доступа к члену), который позволяет упростить представленную ранее проверку на предмет
null
. Вместо явного условного оператора, проверяющего на неравенство значению
null
, теперь можно написать такой код:

static void TesterMethod(string[] args)

Поделиться с друзьями: