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

ЖАНРЫ

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

/// Получить значение int из "базы данных".

int? i = dr.GetIntFromDatabase;

if (i.HasValue)

{

Console.WriteLine("Value of 'i' is: {0}", i.Value);

// Вывод значения переменной i

}

else

{

Console.WriteLine("Value of 'i' is undefined.");

// Значение переменной i не определено

}

// Получить значение bool из "базы данных".

bool? b = dr.GetBoolFromDatabase;

if (b != null)

{

Console.WriteLine("Value of 'b' is: {0}", b.Value);

//
Вывод значения переменной b

}

else

{

Console.WriteLine("Value of 'b' is undefined.");

// Значение переменной b не определено

}

Console.ReadLine;

Использование ссылочных типов, допускающих null (нововведение в версии 8.0)

Важным средством, добавленным в версию C# 8, является поддержка ссылочных типов, допускающих значение

null
. На самом деле изменение было настолько значительным, что инфраструктуру .NET Framework не удалось обновить для поддержки нового средства. В итоге было принято решение поддерживать C# 8 только в .NET Core 3.0 и последующих версиях и также по умолчанию отключить поддержку ссылочных типов, допускающих
null
. В новом проекте .NET Core 3.0/3.1 или .NET 5 ссылочные типы функционируют точно так же, как в C# 7. Это сделано для того, чтобы предотвратить нарушение работы миллиардов строк кода, существовавших в экосистеме до появления C# 8. Разработчики в своих приложениях должны дать согласие на включение ссылочных типов, допускающих
null
.

Ссылочные типы, допускающие

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

Для указания способности иметь значение

null
в ссылочных типах, допускающих
null
, применяется тот же самый символ
?
. Однако он не является сокращением для использования
System.Nullable<T>
, т.к. на месте
Т
могут находиться только типы значений. Не забывайте, что обобщения и ограничения рассматриваются в главе 10.

Включение ссылочных типов, допускающих null

Поддержка для ссылочных типов, допускающих

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

• Контекст с заметками о допустимости значения

null:
включает/отключает заметки о допустимости
null(?)
для ссылочных типов, допускающих
null
.

• Контекст с предупреждениями о допустимости значения

null:
включает/отключает предупреждения компилятора для ссылочных типов, допускающих
null
.

Чтобы увидеть их в действии, создайте новый проект консольного приложения по имени

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;

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