Язык программирования 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
рейтинг книги
Дракон - не подарок
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Разбуди меня
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Провинциал. Книга 2
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
На границе империй. Том 10. Часть 3
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Сумеречный Стрелок 2
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Академия
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Попаданка для Дракона, или Жена любой ценой
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Жена фаворита королевы. Посмешище двора
Фантастика:
фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 12
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Архонт
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Лучший из худших
1. Лучший из худших
Фантастика:
фэнтези
попаданцы
5.25