Поделиться через


Создание типов в C#

В этом руководстве описано, как создавать типы в C#. Вы пишете небольшие объемы кода, а затем компилируете и запускаете этот код. В этом руководстве содержится ряд уроков, которые изучают различные типы типов в C#. Эти уроки учат вас основам языка C#.

Подсказка

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

Предыдущие учебники работали с текстом и цифрами. Строки и числа — это простые типы: каждое из них хранит одно значение. По мере увеличения размера программ необходимо работать с более сложными структурами данных. C# предоставляет различные типы типов, которые можно определить, когда требуется структура данных с большим количеством полей, свойств или поведения. Давайте начнем изучать эти типы.

Кортежи

Кортежи — это упорядоченная последовательность значений с фиксированной длиной. Каждый элемент кортежа имеет тип и необязательное имя. Следующий код объявляет кортеж, представляющий двумерную точку. Нажмите кнопку "Выполнить", чтобы вставить следующий код в интерактивное окно и запустить его.

var pt = (X: 1, Y: 2);

var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");

Подсказка

При изучении C# (или любого языка программирования) при написании кода возникают ошибки. Компилятор находит эти ошибки и сообщает им вам. Если выходные данные содержат сообщения об ошибках, внимательно изучите пример кода и код в интерактивном окне, чтобы узнать, что исправить. Это упражнение поможет вам узнать структуру кода C#.

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

pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");

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

var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");

Кортеж pt2 содержит значение X для pt (6), а pt2.Y равно 10.

Кортежи являются структурными типами. Другими словами, типы кортежей не имеют имен, таких как string или int. Тип кортежа определяется числом членов, называемым arity, и типами этих членов. Имена членов предназначены для удобства. Кортеж можно присвоить кортежу с одинаковой арностью и типами, даже если элементы имеют разные имена. Вы можете добавить следующий код после кода, который вы уже написали в интерактивном окне, и попробуйте:

var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);

Переменная subscript имеет два члена, оба из которых являются целыми числами. Оба subscript и pt представляют собой экземпляры одного и того же типа кортежей: кортеж, содержащий 2 int элемента.

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

var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);

Кортежи легко создавать, но они ограничены в своих возможностях. Типы кортежей не имеют имен, поэтому вы не можете передать смысл набору значений. Типы кортежей не могут добавлять поведение. C# имеет другие типы, которые можно создать, когда ваш тип определяет поведение.

Создание типов записей

Кортежи отлично подходят для тех случаев, когда требуется несколько значений в одной структуре данных. Они облегчаются и могут быть объявлены так, как они используются. По мере использования программы вы можете обнаружить, что в коде используется тот же тип кортежа. Если ваше приложение работает в пространстве двумерного графика, кортежи, представляющие точки, могут быть распространенными. Найдя это, можно объявить record тип, который хранит эти значения и предоставляет дополнительные возможности. В следующем примере кода используется Main метод для представления точки входа для программы. Таким образом, можно объявить тип record перед точкой входа в коде. Нажмите кнопку "Выполнить" в следующем коде, чтобы заменить существующий пример следующим кодом.

Предупреждение

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

Следующий код объявляет и использует record тип для представления Point, а затем использует такую Point структуру в методе Main :

public record Point(int X, int Y);

public static void Main()
{
    Point pt = new Point(1, 1);
    var pt2 = pt with { Y = 10 };
    Console.WriteLine($"The two points are {pt} and {pt2}");
}

Объявление record представляет собой одну строку кода для типа Point, с помощью которой значения X и Y сохраняются в неизменяемых свойствах. Вы используете имя Point, где бы вы ни использовали этот тип. Правильно именованные типы, например Point, предоставляют сведения о том, как используется тип. В Main этом методе показано, как использовать with выражение для создания новой точки, которая является измененной копией существующей точки. pt2 = pt with { Y = 10 } Строка гласит: "pt2 имеет те же значения, что и pt, за исключением того, что Y присваивается значение 10." Вы можете добавить любое количество свойств для изменения в одном выражении with.

Предыдущее record объявление представляет собой одну строку кода, которая заканчивается ;, как и все операторы C#. Вы можете добавить поведение типу record, объявив членов. Элемент записи может быть функцией или несколькими элементами данных. Члены типа находятся в объявлении типов между символами { и }. Замените объявление записи, сделанное следующим кодом:

public record Point(int X, int Y)
{
    public double Slope() => (double)Y / (double)X;
}

Затем добавьте следующий код в Main метод после строки, содержащей with выражение:

double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");

Вы придали строгость кортежу, представляющему значения X и Y. Вы сделали это record определяющим именованный тип и включили элемент для вычисления склона. Тип record — это сокращенное обозначение для record class: тип class, который включает дополнительное поведение. Вы можете изменить Point тип, чтобы сделать его record struct также:

public record struct Point(int X, int Y)
{
    public double Slope() => (double) Y / (double) X;
}

record struct является типом struct, который включает дополнительное поведение, добавленное ко всем типам record.

Структура, класс и типы интерфейсов

Все именованные типы в C# являются class либо типами struct . A class — это ссылочный тип. A struct — это тип значения. Переменные типа значения хранят содержимое экземпляра непосредственно в памяти. Другими словами, record struct Point хранит два целых числа: X и Y. Переменные ссылочного типа хранят ссылку (указатель) на хранилище для экземпляра. Другими словами, ссылка record class Point на блок памяти, содержащий значения для X и Y.

На практике это означает, что типы значений копируются при назначении, но копия экземпляра класса является копией ссылки. Эта скопированная ссылка ссылается на один и тот же экземпляр точки с тем же хранилищем и XY.

Модификатор record указывает компилятору написать несколько элементов. Дополнительные сведения см. в статье о типах записей в разделе "Основы".

При объявлении record типа вы объявляете, что тип должен использовать набор по умолчанию для сравнения равенства, назначения и копирования экземпляров этого типа. Записи — лучший выбор, когда хранение связанных данных является основной функцией вашего типа. При добавлении дополнительных действий рекомендуется использовать struct или class типы без record модификатора.

Типы struct используются для значений, когда требуется более сложное поведение, но их основная задача заключается в хранении этих значений. Типы используются для использования class объектно-ориентированных идиом, таких как инкапсуляция, наследование и полиморфизм.

Вы также можете определить interface типы для объявления поведенческих контрактов, которые должны реализовывать разные типы. class Оба struct типа могут реализовывать интерфейсы.

Обычно используются все эти типы в больших программах и библиотеках. После установки пакета SDK для .NET эти типы можно изучить с помощью учебников по классам в разделе основы.

Вы завершили интерактивное руководство по созданию типов в C#. Вы можете выбрать ссылку ветвей и циклов, чтобы начать следующий интерактивный учебник, или посетить сайт .NET , чтобы скачать пакет SDK для .NET, создать проект на своём компьютере и продолжить программирование. В разделе "Дальнейшие шаги" вы возвращаетесь к данным руководствам.

Дополнительные сведения о типах в C# см. в следующих статьях: