Язык программирования 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).
Поделиться:
Популярные книги
Дракон с подарком
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Бывшие. Война в академии магии
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Мастер клинков. Начало пути
1. Мастер клинков
Фантастика:
фэнтези
9.16
рейтинг книги
Имя нам Легион. Том 8
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Измена. Право на счастье
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Начальник милиции 2
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Камень. Книга 4
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Измена. Мой заклятый дракон
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Предатель. Цена ошибки
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Звездная Кровь. Изгой
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Рождение победителя
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Барону наплевать на правила
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Камень. Книга шестая
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Чужая дочь
Любовные романы:
любовно-фантастические романы
5.00