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

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

Жанры

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

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

Назад в ссср 6

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

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Архонт

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

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

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

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Академия водного пламени

Зимина Юлия
1. Академия юных сердец
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия водного пламени

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

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

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

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

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII