Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве описано, как создавать типы в C#. Вы пишете небольшие объемы кода, а затем компилируете и запускаете этот код. В этом руководстве содержится ряд уроков, которые изучают различные типы типов в C#. Эти уроки учат вас основам языка C#.
Предыдущие учебники работали с текстом и цифрами. Строки и числа — это простые типы: каждый из них хранит одно значение. По мере увеличения размера программ необходимо работать с более сложными структурами данных. C# предоставляет различные типы типов, которые можно определить, когда требуется структура данных с большим количеством полей, свойств или поведения. Давайте начнем изучать эти типы.
Изучив это руководство, вы:
- Создание типов кортежей и управление ими.
- Создание типов записей.
- Узнайте о структурах, классах и интерфейсах.
Предпосылки
У вас должно быть одно из следующих элементов:
- Учетная запись GitHub для использования GitHub Codespaces. Если у вас еще нет учетной записи, вы можете создать бесплатную учетную запись на GitHub.com.
- Компьютер со следующими инструментами:
Чтобы использовать пространства кода, требуется учетная запись GitHub. Если у вас еще нет учетной записи, вы можете создать бесплатную учетную запись на GitHub.com.
Кортежи
Чтобы запустить GitHub Codespace с средой учебника, откройте окно браузера в репозитории пространства кода учебника . Нажмите зеленую кнопку "Код" и вкладку "Пространства кода ". Затем выберите + знак, чтобы создать новое пространство Codespace с помощью этой среды. Если вы выполнили другие учебники в этой серии, вы можете открыть это пространство кода вместо создания нового.
При загрузке пространства кода создайте новый файл в папке учебников с именем tuples.cs.
Откройте новый файл.
Введите или скопируйте следующий код в tuples.cs:
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}.");Запустите программу, введя следующие команды в окне встроенного терминала:
cd tutorials dotnet tuples.csКортежи — это упорядоченная последовательность значений с фиксированной длиной. Каждый элемент кортежа имеет тип и необязательное имя.
Подсказка
При изучении C# (или любого языка программирования) при написании кода возникают ошибки. Компилятор находит эти ошибки и сообщает им вам. Если выходные данные содержат сообщения об ошибках, внимательно изучите пример кода и код, чтобы узнать, что нужно исправить. Вы также можете попросить Copilot найти различия или обнаружить какие-либо ошибки. Это упражнение поможет вам узнать структуру кода C#.
Добавьте следующий код после предыдущего кода, чтобы изменить элемент кортежа:
pt.X = pt.X + 5; Console.WriteLine($"The point is now at {pt}.");Вы также можете создать новый кортеж, представляющий собой измененную копию исходного, с помощью
withвыражения. Добавьте следующий код после существующего кода и введитеdotnet tuples.csв окне терминала, чтобы просмотреть результаты: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);Попробуйте его, введя
dotnet tuples.csв окне терминала. Переменнаяsubscriptимеет два члена, оба из которых являются целыми числами. Иsubscript, иptпредставляют собой экземпляры одного и того же типа кортежа: кортежа, содержащего два элемента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);Попробуйте ввести
dotnet tuples.csснова в окне терминала.
Хотя кортежи легко создать, их возможности ограничены. Типы кортежей не имеют имен, поэтому вы не можете передать смысл набору значений. Типы кортежей не могут добавлять поведение. C# имеет другие типы, которые можно создать, когда ваш тип определяет поведение.
Создание типов записей
Кортежи отлично подходят для тех случаев, когда требуется несколько значений в одной структуре данных. Они легкие, и вы можете определить их в процессе использования. По мере роста программы вы можете обнаружить, что в коде используется тот же тип кортежа. Если ваше приложение работает в двумерном графическом пространстве, кортежи, представляющие точки, могут встречаться часто. При обнаружении этого шаблона можно определить тип record, который хранит эти значения и предоставляет больше возможностей.
Добавьте следующий код, чтобы объявить и использовать тип
recordдля представленияPoint:public record Point(int X, int Y);Предыдущий код должен находиться в нижней части исходного файла. Объявления типов, такие как
recordобъявления, должны соответствовать исполняемым инструкциям в приложении на основе файлов.Добавьте следующий код перед объявлением
record:Point pt3 = new Point(1, 1); var pt4 = pt3 with { Y = 10 }; Console.WriteLine($"The two points are {pt3} and {pt4}");Объявление
recordпредставляет собой одну строку кода для типаPoint, с помощью которой значенияXиYсохраняются в неизменяемых свойствах. Вы используете имяPoint, где бы вы ни использовали этот тип. Правильно именованные типы, напримерPoint, предоставляют сведения о том, как используется тип. В дополнительном коде показано, как использоватьwithвыражение для создания новой точки, которая является измененной копией существующей точки.pt4 = pt3 with { Y = 10 }Строка гласит: "pt4имеет те же значения, что иpt3, за исключением того, чтоYприсваивается значение 10." Вы можете добавить любое количество свойств для изменения в одном выраженииwith.Предыдущее
recordобъявление представляет собой одну строку кода, которая заканчивается;. Вы можете добавить поведение типуrecord, объявив членов. Элемент записи может быть функцией или несколькими элементами данных. Члены типа находятся в объявлении типов между символами{и}.Удалите
;и добавьте следующие строки кода после объявленияrecord.{ public double Slope() => (double)Y / (double)X; }Добавьте следующий код перед объявлением
recordпосле строки, содержащейwithвыражение:double slopeResult = pt4.Slope(); Console.WriteLine($"The slope of {pt4} is {slopeResult}");Введите
dotnet tuples.csв окне терминала для запуска этой версии.Вы придали строгость кортежу, представляющему значения
XиY. Вы создалиrecord, который определяет именованный тип и включает функцию для вычисления наклона. Типrecord— это сокращенное обозначение дляrecord class: типclass, который включает дополнительное поведение.Вы можете изменить
Pointтип, чтобы сделать егоrecord structтакже:public record struct Point(int X, int Y)record structявляется типомstruct, который включает дополнительное поведение, добавленное ко всем типамrecord.Попробуйте использовать эту версию, введя
dotnet tuples.csв окне терминала.
Структура, класс и типы интерфейсов
Все конкретные именованные типы в C# являются либо типами class, либо struct, включая типы record. A class — это ссылочный тип. A struct — это тип значения. Переменные типа значения хранят содержимое экземпляра непосредственно в памяти. Другими словами, record struct Point хранит два целых числа: X и Y. Переменные ссылочного типа хранят ссылку (указатель) на хранилище для экземпляра. Другими словами, ссылка record class Point на блок памяти, содержащий значения для X и Y.
На практике это означает, что типы значений копируются при назначении, но копия экземпляра класса является копией ссылки. Эта скопированная ссылка ссылается на один и тот же экземпляр точки с тем же хранилищем и XY.
Модификатор record указывает компилятору написать несколько элементов. Дополнительные сведения см. в статье о типах записей в разделе "Основы".
При объявлении record типа вы объявляете, что тип должен использовать набор по умолчанию для сравнения равенства, назначения и копирования экземпляров этого типа. Записи — лучший выбор, когда хранение связанных данных является основной функцией вашего типа. При добавлении дополнительных действий рекомендуется использовать struct или class типы без record модификатора.
Используйте struct типы значений, если требуется более сложное поведение, но основная ответственность заключается в хранении значений. Используйте class типы для использования объектно-ориентированных идиом, таких как инкапсуляция, наследование и полиморфизм.
Вы также можете определить interface типы для объявления поведенческих контрактов, которые должны реализовывать разные типы.
struct Оба class типа могут реализовывать интерфейсы.
Обычно используются все эти типы в больших программах и библиотеках. После установки пакета SDK для .NET эти типы можно изучить с помощью учебников по классам в разделе основы.
Вы выполнили руководство по созданию типов в C#. Дополнительные сведения о типах в C# см. в следующих статьях:
Очистка ресурсов
GitHub автоматически удаляет пространство Codespace через 30 дней бездействия. Если вы планируете ознакомиться с дополнительными руководствами в этой серии, вы можете оставить ваш Codespace активным. Если вы готовы посетить сайт .NET , чтобы скачать пакет SDK для .NET, можно удалить пространство Codespace. Чтобы удалить ваш Codespace, откройте окно браузера и перейдите к вашим Codespace. В окне отобразится список ваших codespaces. Выберите три точки (...) в записи для пространства кода учебника для обучения и выберите удалить.