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

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

Жанры

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

static void LocalNullableVariablesUsingNullable

{

// Определить несколько типов, допускающих null,

// с применением Nullable<T>.

Nullable<int> nullableInt = 10;

Nullable<double> nullableDouble = 3.14;

Nullable<bool> nullableBool = null;

Nullable<char> nullableChar = 'a';

Nullable<int>[] arrayOfNullableInts = new Nullable<int>[10];

}

Как

отмечалось ранее, типы данных, допускающие
null
, особенно полезны при взаимодействии с базами данных, потому что столбцы в таблицах данных могут быть намеренно оставлены пустыми (скажем, быть неопределенными). В целях демонстрации рассмотрим показанный далее класс, эмулирующий процесс доступа к базе данных с таблицей, в которой два столбца могут принимать значения
null
. Обратите внимание, что метод
GetlntFromDatabase
не присваивает значение члену целочисленного типа, допускающего
null
, тогда как метод
GetBoolFromDatabase
присваивает допустимое значение члену типа
bool
?

class DatabaseReader

{

// Поле данных типа, допускающего null.

public int? numericValue = null;

public bool? boolValue = true;

// Обратите внимание на возвращаемый тип, допускающий null.

public int? GetIntFromDatabase

{ return numericValue; }

// Обратите внимание на возвращаемый тип, допускающий null.

public bool? GetBoolFromDatabase

{ return boolValue; }

}

В следующем коде происходит обращение к каждому члену класса

DatabaseReader
и выяснение присвоенных значений с применением членов
HasValue
и
Value
, а также операции равенства C# (точнее операции "не равно"):

Console.WriteLine("***** Fun with Nullable Value Types *****\n");

DatabaseReader dr = new DatabaseReader;

/// Получить значение 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).

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

Последний Паладин. Том 2

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

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

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

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник