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

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

Жанры

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

static void ExecutePatternMatchingSwitch

{

Console.WriteLine("1 [Integer (5)], 2 [String (\"Hi\")], 3 [Decimal (2.5)]");

Console.Write("Please choose an option: ");

string userChoice = Console.ReadLine;

object choice;

// Стандартный оператор switch, в котором применяется

// сопоставление с образцом с константами

switch (userChoice)

{

case "1":

choice = 5;

break;

case "2":

choice = "Hi";

break;

case "3":

choice = 2.5;

break;

default:

choice = 5;

break;

}

//
Новый оператор switch, в котором применяется

// сопоставление с образцом с типами

switch (choice)

{

case int i:

Console.WriteLine("Your choice is an integer.");

// Выбрано целое число

break;

case string s:

Console.WriteLine("Your choice is a string.");

// Выбрана строка

break;

case decimal d:

Console.WriteLine("Your choice is a decimal.");

// Выбрано десятичное число

break;

default:

Console.WriteLine("Your choice is something else");

// Выбрано что-то другое

break;

}

Console.WriteLine;

}

В первом операторе

switch
используется стандартный образец с константами; он включен только ради полноты этого (тривиального) примера. Во втором операторе
switch
переменная типизируется как
object
и на основе пользовательского ввода может быть разобрана в тип данных
int
,
string
или
decimal
. В зависимости от типа переменной совпадения дают разные операторы
case
. Вдобавок к проверке типа данных в каждом операторе
case
выполняется присваивание переменной (кроме случая
default
). Модифицируйте код, чтобы задействовать значения таких переменных:

// Новый оператор switch, в котором применяется

// сопоставление с образцом с типами

switch (choice)

{

case int i:

Console.WriteLine("Your choice is an integer {0}.",i);

break;

case string s:

Console.WriteLine("Your choice is a string. {0}", s);

break;

case decimal d:

Console.WriteLine("Your choice is a decimal. {0}", d);

break;

default:

Console.WriteLine("Your choice is something else");

break;

}

Кроме

оценки типа сопоставляющего выражения к операторам
case
могут быть добавлены конструкции
when
для оценки условий на переменной. В представленном ниже примере в дополнение к проверке типа производится проверка на совпадение преобразованного типа:

static void ExecutePatternMatchingSwitchWithWhen

{

Console.WriteLine("1 [C#], 2 [VB]");

Console.Write("Please pick your language preference: ");

object langChoice = Console.ReadLine;

var choice = int.TryParse(langChoice.ToString,

out int c) ? c : langChoice;

switch (choice)

{

case int i when i == 2:

case string s when s.Equals("VB", StringComparison.OrdinalIgnoreCase):

Console.WriteLine("VB: OOP, multithreading, and more!");

// VB: ООП, многопоточность и многое другое!

break;

case int i when i == 1:

case string s when s.Equals("C#", StringComparison.OrdinalIgnoreCase):

Console.WriteLine("Good choice, C# is a fine language.");

// Хороший выбор. C# - замечательный язык.

break;

default:

Console.WriteLine("Well...good luck with that!");

// Хорошо, удачи с этим!

break;

}

Console.WriteLine;

}

Здесь к оператору

switch
добавляется новое измерение, поскольку порядок следования операторов
case
теперь важен. При использовании образца с константами каждый оператор
case
обязан быть уникальным. В случае применения образца с типами это больше не так. Например, следующий код будет давать совпадение для каждого целого числа в первом операторе
case
, а второй и третий оператор
case
никогда не выполнятся (на самом деле такой код даже не скомпилируется):

switch (choice)

{

case int i:

//do something

break;

case int i when i == 0:

//do something

break;

case int i when i == -1:

// do something

break;

}

В первоначальном выпуске C# 7 возникало небольшое затруднение при сопоставлении с образцом, когда в нем использовались обобщенные типы. В версии C# 7.1 проблема была устранена. Обобщенные типы рассматриваются в главе 10.

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

Адвокат вольного города

Парсиев Дмитрий
1. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Сумеречный Стрелок 2

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

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Лучший из худших

Дашко Дмитрий
1. Лучший из худших
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Лучший из худших