Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Сигнатуру метода

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

static string RockPaperScissors(

(string first, string second) value)

{

return value switch

{

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

};

}

Деконструирование кортежей

Деконструирование

является термином, описывающим отделение свойств кортежа друг от друга с целью применения по одному. Именно это делает метод
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}");

Деконструирование кортежей с позиционным сопоставлением с образцом (нововведение в версии 8.0)

Когда кортежи имеют доступный метод

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
.

Резюме

Глава начиналась с исследования массивов. Затем обсуждались ключевые слова С#, которые позволяют строить специальные методы. Вспомните, что по умолчанию параметры передаются по значению; тем не менее, параметры можно передавать и по ссылке, пометив их модификаторами

ref
или
out
. Кроме того, вы узнали о роли необязательных и именованных параметров, а также о том, как определять и вызывать методы, принимающие массивы параметров.

После рассмотрения темы перегрузки методов в главе приводились подробные сведения, касающиеся способов определения перечислений и структур в C# и их представления в библиотеках базовых классов .NET Core. Попутно рассматривались основные характеристики типов значений и ссылочных типов, включая их поведение при передаче в качестве параметров методам, а также способы взаимодействия с типами данных, допускающими

null
, и переменными, которые могут иметь значение
null
(например, переменными ссылочных типов и переменными типов значений, допускающих
null
), с использованием операций
?
,
??
и
??=
.

Финальный раздел был посвящен давно ожидаемому средству в языке C# — кортежам. После выяснения, что они собой представляют и как работают, кортежи применялись для возвращения множества значений из методов и для деконструирования специальных типов. В главе 5 вы начнете погружаться в детали объектно-ориентированного программирования.

Часть III

Объектно-ориентированное программирование на C#

Глава 5

Инкапсуляция

Поделиться с друзьями: