Категории
Самые читаемые
ChitatKnigi.com » 🟢Компьютеры и Интернет » Программирование » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Читать онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
1 ... 60 61 62 63 64 65 66 67 68 ... 407
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
предупреждениями о допустимости значения 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;

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

1 ... 60 61 62 63 64 65 66 67 68 ... 407
Перейти на страницу:
Открыть боковую панель
Комментарии
Ксения
Ксения 20.12.2024 - 00:16
Через чур правильный герой. Поэтому и остался один
Настя
Настя 08.12.2024 - 03:18
Прочла с удовольствием. Необычный сюжет с замечательной концовкой
Марина
Марина 08.12.2024 - 02:13
Не могу понять, где продолжение... Очень интересная история, хочется прочесть далее
Мприна
Мприна 08.12.2024 - 01:05
Эх, а где же продолжение?
Анна
Анна 07.12.2024 - 00:27
Какая прелестная история! Кратко, ярко, захватывающе.