Язык программирования C#9 и платформа .NET5
Часть 75 из 642 Информация о книге
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никогда не выполнятся (на самом деле такой код даже не скомпилируется):caseswitch (choice){case int i://do somethingbreak;case int i when i == 0://do somethingbreak;case int i when i == -1:// do somethingbreak;}В первоначальном выпуске C# 7 возникало небольшое затруднение при сопоставлении с образцом, когда в нем использовались обобщенные типы. В версии C# 7.1 проблема была устранена. Обобщенные типы рассматриваются в главе 10.
На заметку! Все продемонстрированные ранее улучшения сопоставления с образцом в C# 9.0 также можно применять в операторах
.switchИспользование выражений switch (нововведение в версии 8.0)
В версии C# 8 появились выражения
, позволяющие присваивать значение переменной в лаконичном операторе. Рассмотрим версию C# 7 методаswitch, который принимает имя цвета и возвращает для него шестнадцатеричное значение: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";};}С помощью новых выражений
в C# 8 код предыдущего метода можно переписать следующим образом, сделав его гораздо более лаконичным:switchstatic string FromRainbow(string colorBand){return colorBand switch{"Red" => "#FF0000","Orange" => "#FF7F00","Yellow" => "#FFFF00","Green" => "#00FF00","Blue" => "#0000FF","Indigo" => "#4B0082","Violet" => "#9400D3",_ => "#FFFFFF",};}