Язык программирования C#9 и платформа .NET5
var (first, _, last) = SplitNames("Philip F Japikse");Console.WriteLine($"{first}:{last}");Значение, соответствующее отчеству, в кортеже отбрасывается.
Использование выражений switch с сопоставлением с образцом для кортежей (нововведение в версии 8.0)
Теперь, когда вы хорошо разбираетесь в кортежах, самое время возвратиться к примеру выражения
с кортежами, который приводился в конце главы 3:switch// Выражения switch с кортежами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.",};}В этом примере два параметра преобразуются в кортеж, когда передаются выражению
. В выраженииswitchпредставлены подходящие значения, а все остальные случаи обрабатывает последний кортеж, состоящий из двух символов отбрасывания.switchСигнатуру метода
можно было бы записать так, чтобы метод принимал кортеж, например:RockPaperScissors()static string RockPaperScissors((string first, string second) value){return value switch{// Для краткости код не показан};}Деконструирование кортежей
Деконструирование является термином, описывающим отделение свойств кортежа друг от друга с целью применения по одному. Именно это делает метод
. Но есть и другой случай использования такого приема — деконструирование специальных типов.FillTheseValues()Возьмем укороченную версию структуры
, которая применялась ранее в главе. В нее был добавлен новый метод по имениPoint, возвращающий индивидуальные свойства экземпляраDeconstruct()в виде кортежа со свойствамиPointиXPos:YPosstruct Point{// Поля структуры.public int X;public int Y;// Специальный конструктор.public Point(int XPos, int YPos){X = XPos;Y = YPos;}<b> public (int XPos, int YPos) Deconstruct() => (X, Y);</b>}Новый метод
выделен полужирным. Его можно именовать как угодно, но обычно он имеет имяDeconstruct(). В результате с помощью единственного вызова метода можно получить индивидуальные значения структуры путем возвращения кортежа:Deconstruct()Point p = new Point(7,5);var pointValues = p.Deconstruct();Console.WriteLine($"X is: {pointValues.XPos}");Console.WriteLine($"Y is: {pointValues.YPos}");Деконструирование кортежей с позиционным сопоставлением с образцом (нововведение в версии 8.0)
Когда кортежи имеют доступный метод
, деконструирование можно применять в выраженииDeconstruct(), основанном на кортежах. Следующий код полагается на примерswitchи использует значения сгенерированного кортежа в конструкцияхPointвыраженияwhen:switchstatic 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()