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

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

Жанры

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

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)

{

// Мы должны проверять на предмет null перед доступом к данным массива!

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

}

В этом случае условный оператор не применяется. Взамен к переменной массива

string
в качестве суффикса добавлена операция
?
. Если переменная
args
равна
null
, тогда обращение к свойству
Length
не приведет к ошибке во время выполнения. Чтобы вывести действительное значение, можно было бы воспользоваться операцией объединения с
null
и установить стандартное значение:

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

Существуют дополнительные области написания кода, в которых

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

Понятие кортежей (нововведение и обновление в версии 7.0)

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

FunWithTuples
. Как упоминалось ранее в главе, одна из целей применения параметров
out
— получение более одного значения из вызова метода. Еще один способ предусматривает использование конструкции под названием кортежи.

Кортежи, которые являются легковесными структурами данных, содержащими множество полей, фактически появились в версии C# 6, но применяться могли в крайне ограниченной манере. Кроме того, в их реализации C# 6 существовала значительная проблема: каждое поле было реализовано как ссылочный тип, что потенциально порождало проблемы с памятью и/или производительностью (из-за упаковки/распаковки).

В версии C# 7 кортежи вместо ссылочных типов используют новый тип данных

ValueTuple
, сберегая значительных объем памяти. Тип данных
ValueTuple
создает разные структуры на основе количества свойств для кортежа. Кроме того, в C# 7 каждому свойству кортежа можно назначать специфическое имя (подобно переменным), что значительно повышает удобство работы с ними.

Относительно кортежей важно отметить два момента:

• поля не подвергаются проверке достоверности;

• определять собственные методы нельзя.

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

Начало работы с кортежами

Итак, достаточно теории, давайте напишем какой-нибудь код! Чтобы создать кортеж, просто повестите значения, подлежащие присваиванию, в круглые скобки:

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

Последний Паладин. Том 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
рейтинг книги
Личник