Читаем Язык программирования C#9 и платформа .NET5 полностью

  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.",

  };

}

В этом примере два параметра преобразуются в кортеж, когда передаются выражению switch. В выражении switch представлены подходящие значения, а все остальные случаи обрабатывает последний кортеж, состоящий из двух символов отбрасывания.

Сигнатуру метода RockPaperScissors можно было бы записать так, чтобы метод принимал кортеж, например:

static string RockPaperScissors(

  (string first, string second) value)

{

  return value switch

  {

    // Для краткости код не показан

  };

}

<p id="AutBody_Root201">Деконструирование кортежей</p>

Деконструирование является термином, описывающим отделение свойств кортежа друг от друга с целью применения по одному. Именно это делает метод FillTheseValues. Но есть и другой случай использования такого приема — деконструирование специальных типов.

Возьмем укороченную версию структуры Point, которая применялась ранее в главе. В нее был добавлен новый метод по имени Deconstruct, возвращающий индивидуальные свойства экземпляра Point в виде кортежа со свойствами XPos и YPos:

struct Point

{

  // Поля структуры.

  public int X;

  public int Y;

  // Специальный конструктор.

  public Point(int XPos, int YPos)

  {

    X = XPos;

    Y = YPos;

  }

  public (int XPos, int YPos) Deconstruct => (X, Y);

}

Новый метод Deconstruct выделен полужирным. Его можно именовать как угодно, но обычно он имеет имя Deconstruct. В результате с помощью единственного вызова метода можно получить индивидуальные значения структуры путем возвращения кортежа:

Point p = new Point(7,5);

var pointValues = p.Deconstruct;

Console.WriteLine($"X is: {pointValues.XPos}");

Console.WriteLine($"Y is: {pointValues.YPos}");

<p id="AutBody_Root202">Деконструирование кортежей с позиционным сопоставлением с образцом (нововведение в версии 8.0)</p>

Когда кортежи имеют доступный метод Deconstruct, деконструирование можно применять в выражении switch, основанном на кортежах. Следующий код полагается на пример Point и использует значения сгенерированного кортежа в конструкциях when выражения switch:

static string GetQuadrant1(Point p)

{

  return p.Deconstruct switch

  {

    (0, 0) => "Origin",

    var (x, y) when x > 0 && y > 0 => "One",

    var (x, y) when x < 0 && y > 0 => "Two",

    var (x, y) when x < 0 && y < 0 => "Three",

    var (x, y) when x > 0 && y < 0 => "Four",

    var (_, _) => "Border",

  };

}

Если метод Deconstruct определен с двумя параметрами out, тогда выражение switch будет автоматически деконструировать экземпляр Point. Добавьте к Point еще один метод Deconstruct:

public void Deconstruct(out int XPos, out int YPos)

  => (XPos,YPos)=(X, Y);

Теперь можно модифицировать (или добавить новый) метод GetQuadrant, как показано ниже:

static string GetQuadrant2(Point p)

{

  return p switch

  {

    (0, 0) => "Origin",

   var (x, y) when x > 0 && y > 0 => "One",

    var (x, y) when x < 0 && y > 0 => "Two",

    var (x, y) when x < 0 && y < 0 => "Three",

    var (x, y) when x > 0 && y < 0 => "Four",

    var (_, _) => "Border",

  };

}

Изменение очень тонкое (и выделено полужирным). В выражении switch вместо вызова р.Deconstruct применяется просто переменная Point.

<p id="AutBody_Root203">Резюме</p>
Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT