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.
На заметку! Все продемонстрированные ранее улучшения сопоставления с образцом в C# 9.0 также можно применять в операторах switch
.
Использование выражений switch (нововведение в версии 8.0)
В версии C# 8 появились выражения switch
, позволяющие присваивать значение переменной в лаконичном операторе. Рассмотрим версию C# 7 метода FromRainbowClassic
, который принимает имя цвета и возвращает для него шестнадцатеричное значение:
static string FromRainbowClassic(string colorBand)
{
switch (colorBand)
{
case "Red":
return "#FF0000";
case "Orange":
return "#FF7F00";
case "Yellow":
return "#FFFF00";
case "Green":
return "#00FF00";
case "Blue":
return "#0000FF";
case "Indigo":
return "#4B0082";
case "Violet":
return "#9400D3";
default:
return "#FFFFFF";
};
}
С помощью новых выражений switch
в C# 8 код предыдущего метода можно переписать следующим образом, сделав его гораздо более лаконичным:
static string FromRainbow(string colorBand)
{
return colorBand switch
{
"Red" => "#FF0000",
"Orange" => "#FF7F00",
"Yellow" => "#FFFF00",
"Green" => "#00FF00",
"Blue" => "#0000FF",
"Indigo" => "#4B0082",
"Violet" => "#9400D3",
_ => "#FFFFFF",
};
}
В приведенном примере присутствует много непонятного, начиная с лямбда-операции (=>
) и заканчивая отбрасыванием (_
). Все это будет раскрыто позже в книге и данный пример окончательно прояснится.
Перед тем, как завершить обсуждение темы выражений switch
, давайте рассмотрим еще один пример, в котором вовлечены кортежи. Кортежи подробно раскрываются в главе 4, а пока считайте кортеж простой конструкцией, которая содержит более одного значения и определяется посредством круглых скобок, подобно следующему кортежу, содержащему значения string
и int
:
(string, int)
В показанном ниже примере два значения, передаваемые методу RockPapeScissors
, преобразуются в кортеж, после чего выражение switch
вычисляет два значения в единственном выражении. Такой прием позволяет сравнивать в операторе switch
более одного выражения:
//Switch expression with Tuples
static string RockPaperScissors(string first, string second)
{
return (first, second) switch
{
("rock", "paper") => "Paper wins.",
("rock", "scissors") => "Rock wins.",
("paper", "rock") => "Paper wins.",
("paper", "scissors") => "Scissors wins.",
("scissors", "rock") => "Rock wins.",
("scissors", "paper") => "Scissors wins.",
(_, _) => "Tie.",
};
}
Чтобы вызвать метод RockPaperScissors
, добавьте в метод Main
следующие строки кода:
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT