Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Страница 75

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
.

Использование выражений 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",

  };

}