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

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

Читать онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
1 ... 63 64 65 66 67 68 69 70 71 ... 407
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
имя 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

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

В главах 3 и 4 было исследовано несколько основных синтаксических конструкций, присущих любому приложению .NET Core, которое вам придется разрабатывать. Начиная с данной главы, мы приступаем к изучению объектно-ориентированных возможностей языка С#. Первым, что вам предстоит узнать, будет процесс построения четко определенных типов классов, которые поддерживают любое количество конструкторов. После введения в основы определения классов и размещения объектов остаток главы будет посвящен теме инкапсуляции. В ходе изложения вы научитесь определять свойства классов, а также ознакомитесь с подробными сведениями о ключевом слове static, синтаксисе инициализации объектов, полях только для чтения, константных данных и частичных классах.

Знакомство с типом класса C#

С точки зрения платформы .NET Core наиболее фундаментальной программной конструкцией является тип класса. Формально класс — это определяемый пользователем тип, состоящий из полей данных (часто называемых переменными-членами) и членов, которые оперируют полями данных (к ним относятся конструкторы, свойства, методы, события и т.д.). Коллективно набор полей данных представляет "состояние" экземпляра класса (также известного как объект). Мощь объектно-ориентированных языков, таких как С#, заключается в том, что за счет группирования данных и связанной с ними функциональности в унифицированное определение класса вы получаете возможность моделировать свое программное обеспечение в соответствии с сущностями реального мира.

Для начала создайте новый проект консольного приложения C# по имени SimpleClassExample. Затем добавьте в проект новый файл класса (Car.cs). Поместите в файл Car.cs оператор using и определите пространство имен, как показано ниже:

using System;

namespace SimpleClassExample

{

}

На заметку! В приводимых далее примерах определять пространство имен строго обязательно. Однако рекомендуется выработать привычку использовать пространства имен во всем коде, который вы будете писать. Пространства имен подробно обсуждались в главе 1.

Класс определяется в C# с применением ключевого слова class. Вот как выглядит простейшее объявление класса (позаботьтесь о том, чтобы объявление класса находилось внутри пространства имен SimpleClassExample):

class Car

{

}

После определения типа класса необходимо определить набор переменных-членов, которые будут использоваться для представления его состояния. Например, вы можете принять решение, что объекты Car (автомобили) должны иметь поле данных типа int, представляющее текущую скорость, и поле данных типа string для представления дружественного названия автомобиля. С учетом таких начальных проектных положений класс Car будет выглядеть следующим образом:

class Car

{

  // 'Состояние' объекта Car.

  public string petName;

  public int currSpeed;

}

Обратите внимание, что переменные-члены объявлены с применением модификатора доступа public. Открытые (public) члены класса доступны напрямую после того,

1 ... 63 64 65 66 67 68 69 70 71 ... 407
Перейти на страницу:
Открыть боковую панель
Комментарии
Ксения
Ксения 20.12.2024 - 00:16
Через чур правильный герой. Поэтому и остался один
Настя
Настя 08.12.2024 - 03:18
Прочла с удовольствием. Необычный сюжет с замечательной концовкой
Марина
Марина 08.12.2024 - 02:13
Не могу понять, где продолжение... Очень интересная история, хочется прочесть далее
Мприна
Мприна 08.12.2024 - 01:05
Эх, а где же продолжение?
Анна
Анна 07.12.2024 - 00:27
Какая прелестная история! Кратко, ярко, захватывающе.