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
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
static string FromRainbow(string colorBand)
{
return colorBand switch
{
"Red" => "#FF0000",
"Orange" => "#FF7F00",
"Yellow" => "#FFFF00",
"Green" => "#00FF00",
"Blue" => "#0000FF",
"Indigo" => "#4B0082",
"Violet" => "#9400D3",
_ => "#FFFFFF",
};
}
В приведенном примере присутствует много непонятного, начиная с лямбда-операции (=>
_). Все это будет раскрыто позже в книге и данный пример окончательно прояснится.Перед тем, как завершить обсуждение темы выражений switch
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