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


Руководство. Создание типов в C#

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

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

Изучив это руководство, вы:

  • Создание типов кортежей и управление ими.
  • Создание типов записей.
  • Узнайте о структурах, классах и интерфейсах.

Предпосылки

У вас должно быть одно из следующих элементов:

Чтобы использовать пространства кода, требуется учетная запись GitHub. Если у вас еще нет учетной записи, вы можете создать бесплатную учетную запись на GitHub.com.

Кортежи

Чтобы запустить GitHub Codespace с средой учебника, откройте окно браузера в репозитории пространства кода учебника . Нажмите зеленую кнопку "Код" и вкладку "Пространства кода ". Затем выберите + знак, чтобы создать новое пространство Codespace с помощью этой среды. Если вы выполнили другие учебники в этой серии, вы можете открыть это пространство кода вместо создания нового.

  1. При загрузке пространства кода создайте новый файл в папке учебников с именем tuples.cs.

  2. Откройте новый файл.

  3. Введите или скопируйте следующий код в 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}.");
    
  4. Запустите программу, введя следующие команды в окне встроенного терминала:

    cd tutorials
    dotnet tuples.cs
    

    Кортежи — это упорядоченная последовательность значений с фиксированной длиной. Каждый элемент кортежа имеет тип и необязательное имя.

    Подсказка

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

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

    pt.X = pt.X + 5;
    Console.WriteLine($"The point is now at {pt}.");
    
  6. Вы также можете создать новый кортеж, представляющий собой измененную копию исходного, с помощью 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, и типами этих членов. Имена членов предназначены для удобства. Кортеж можно присвоить кортежу с одинаковой арностью и типами, даже если элементы имеют разные имена.

  7. Вы можете добавить следующий код после уже написанного кода:

    var subscript = (A: 0, B: 0);
    subscript = pt;
    Console.WriteLine(subscript);
    
  8. Попробуйте его, введя dotnet tuples.cs в окне терминала. Переменная subscript имеет два члена, оба из которых являются целыми числами. И subscript, и pt представляют собой экземпляры одного и того же типа кортежа: кортежа, содержащего два элемента int.

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

  9. Добавьте следующий код для создания новых типов кортежей:

    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);
    
  10. Попробуйте ввести dotnet tuples.cs снова в окне терминала.

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

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

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

  1. Добавьте следующий код, чтобы объявить и использовать тип record для представления Point:

    public record Point(int X, int Y);
    

    Предыдущий код должен находиться в нижней части исходного файла. Объявления типов, такие как record объявления, должны соответствовать исполняемым инструкциям в приложении на основе файлов.

  2. Добавьте следующий код перед объявлением 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, объявив членов. Элемент записи может быть функцией или несколькими элементами данных. Члены типа находятся в объявлении типов между символами { и }.

  3. Удалите ; и добавьте следующие строки кода после объявления record.

    {
        public double Slope() => (double)Y / (double)X;
    }
    
  4. Добавьте следующий код перед объявлением record после строки, содержащей with выражение:

    double slopeResult = pt4.Slope();
    Console.WriteLine($"The slope of {pt4} is {slopeResult}");
    
  5. Введите dotnet tuples.cs в окне терминала для запуска этой версии.

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

  6. Вы можете изменить Point тип, чтобы сделать его record struct также:

    public record struct Point(int X, int Y)
    

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

  7. Попробуйте использовать эту версию, введя 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. Выберите три точки (...) в записи для пространства кода учебника для обучения и выберите удалить.

Следующий шаг