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.
На заметку! Все продемонстрированные ранее улучшения сопоставления с образцом в C# 9.0 также можно применять в операторах switch.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
Использование выражений 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",
};
}