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

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

Жанры

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

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

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

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

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

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

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5