Язык программирования C#9 и платформа .NET5
default:// Стандартное действиеbreak;}}Выполнение сопоставления с образцом в операторах switch (нововведение в версии 7.0, обновление в версии 9.0)
До выхода версии C# 7 сопоставляющие выражения в операторах
ограничивались сравнением переменной с константными значениями, что иногда называют образцом с константами. В C# 7 операторыswitchспособны также задействовать образец с типами, при котором операторыswitchмогут оценивать тип проверяемой переменной, и выраженияcaseбольше не ограничиваются константными значениями. Правило относительно того, что каждый операторcaseдолжен завершаться с помощьюcaseилиreturn, по-прежнему остается в силе; тем не менее, операторыbreakне поддерживают применение образца с типами.gotoНа заметку! Если вы новичок в объектно-ориентированном программировании, тогда материал этого раздела может слегка сбивать с толку. Все прояснится в главе 6, когда мы вернемся к новым средствам сопоставления с образцом C# 7 в контексте базовых и производных классов. Пока вполне достаточно понимать, что появился мощный новый способ написания операторов
.switchДобавьте еще один метод по имени
со следующим кодом:ExecutePatternMatchingSwitch()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