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

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

Жанры

Язык программирования 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.

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

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

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

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник