Читать книги » Книги » Компьютеры и Интернет » Программирование » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

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

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 561
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

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

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

1 ... 64 65 66 67 68 ... 407 ВПЕРЕД
Перейти на страницу:
что специальные имена полей существуют только на этапе компиляции и не доступны при инспектировании кортежа во время выполнения с использованием рефлексии (рефлексия раскрывается в главе 17).

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

Console.WriteLine("=> Nested Tuples");

var nt = (5, 4, ("a", "b"));

Использование выведенных имен переменных (обновление в версии C# 7.1)

В C# 7.1 появилась возможность выводить имена переменных кортежей, как показано ниже:

Console.WriteLine("=> Inferred Tuple Names");

var foo = new {Prop1 = "first", Prop2 = "second"};

var bar = (foo.Prop1, foo.Prop2);

Console.WriteLine($"{bar.Prop1};{bar.Prop2}");

Понятие эквивалентности/неэквивалентности кортежей (нововведение в версии 7.3)

Дополнительным средством в версии C# 7.1 является эквивалентность (==) и неэквивалентность (!=) кортежей. При проверке на неэквивалентность операции сравнения будут выполнять неявные преобразования типов данных внутри кортежей, включая сравнение допускающих и не допускающих null кортежей и/или свойств. Это означает, что следующие проверки нормально работают, несмотря на разницу между int и long:

Console.WriteLine("=> Tuples Equality/Inequality");

// Поднятые преобразования

var left = (a: 5, b: 10);

(int? a, int? b) nullableMembers = (5, 10);

Console.WriteLine(left == nullableMembers); // Тоже True

// Преобразованным типом слева является (long, long)

(long a, long b) longTuple = (5, 10);

Console.WriteLine(left == longTuple); // Тоже True

// Преобразования выполняются с кортежами (long, long)

(long a, int b) longFirst = (5, 10);

(int a, long b) longSecond = (5, 10);

Console.WriteLine(longFirst == longSecond); // Тоже True

Кортежи, которые содержат кортежи, также можно сравнивать, но только если они имеют одну и ту же форму. Нельзя сравнивать кортеж с тремя свойствами int и кортеж, содержащий два свойства int плюс кортеж.

Использование отбрасывания с кортежами

Ранее в главе для возвращения из вызова метода более одного значения применялись параметры out. Для этого существуют другие способы вроде создания класса или структуры специально для возвращения значений. Но если такой класс или структура используется только в целях передачи данных для одного метода, тогда нет нужды выполнять излишнюю работу и писать добавочный код. Кортежи прекрасно подходят для решения задачи, т.к. они легковесны, просты в объявлении и несложны в применении.

Ниже представлен один из примеров, рассмотренных в разделе о параметрах out. Метод FillTheseValues() возвращает три значения, но требует использования в вызывающем коде трех параметров как механизма передачи:

static void FillTheseValues(out int a, out string b, out bool c)

{

  a = 9;

  b = "Enjoy your string.";

  c = true;

}

За счет применения кортежа от параметров можно избавиться и все равно получать обратно три значения:

static (int a,string b,bool c) FillTheseValues()

{

  return (9,"Enjoy your string.",true);

}

Вызывать новый метод не сложнее любого другого метода:

var samples = FillTheseValues();

Console.WriteLine($"Int is: {samples.a}");

Console.WriteLine($"String is: {samples.b}");

Console.WriteLine($"Boolean is: {samples.c}");

Возможно, даже лучшим примером будет разбор полного имени на отдельные части (имя (first), отчество (middle), фамилия (last)). Следующий метод SplitNames() получает полное имя и возвращает кортеж с составными частями:

static (string first, string middle, string last) SplitNames(string fullName)

{

  // Действия, необходимые для расщепления полного имени.

  return ("Philip", "F", "Japikse");

}

Использование отбрасывания с кортежами

Продолжим пример с методом SplitNames(). Пусть известно, что требуются только имя и фамилия, но не отчество. В таком случае можно указать имена свойств для значений, которые необходимо возвращать, а ненужные значения заменить заполнителем в виде подчеркивания (_):

var (first, _, last) = SplitNames("Philip F Japikse");

Console.WriteLine($"{first}:{last}");

Значение, соответствующее отчеству, в кортеже отбрасывается.

Использование выражений switch с сопоставлением с образцом для кортежей (нововведение в версии 8.0)

Теперь, когда вы хорошо разбираетесь в кортежах, самое время возвратиться к примеру выражения switch с кортежами, который приводился в конце главы 3:

// Выражения 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 и 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() выделен полужирным. Его можно именовать как угодно, но обычно он имеет

1 ... 64 65 66 67 68 ... 407 ВПЕРЕД
Перейти на страницу:
Комментарии (0)