В C# существуют три ключевых типа для представления данных: структуры (struct), классы (class) и записи (record). Каждый из них имеет свои особенности, влияющие на производительность, копирование объектов и область применения.
Классы
Класс (class) — это ссылочный тип, который хранится в управляемой куче (heap). При передаче объекта класса в метод передается ссылка на этот объект, что позволяет изменять его состояние.
Особенности классов:
- Ссылочный тип.
- Хранится в куче.
- Поддерживает наследование.
- Изменяемый (mutable) по умолчанию.
Пример класса:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Структуры
Структура (struct) — это значимый тип, который хранится в стеке (stack) или внутри другого объекта. При передаче структуры в метод создается ее копия, что предотвращает изменение оригинального объекта.
Особенности структур:
- Значимый тип.
- Хранится в стеке.
- Не поддерживает наследование.
- Оптимизирована для небольших объектов.
Пример структуры:
struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
Записи
Запись (record) — это специальный тип, предназначенный для работы с неизменяемыми (immutable) данными. По умолчанию, запись использует семантику значений, но при этом является ссылочным типом.
Особенности записей:
- Ссылочный тип (кроме
record struct
). - Автоматически поддерживает неизменяемость.
- Объекты сравниваются по содержимому, а не по ссылке.
Пример записи:
record Person(string Name, int Age);
Сравнение классов, структур и записей
Характеристика | Class | Struct | Record |
---|---|---|---|
Тип | Ссылочный | Значимый | Ссылочный (по умолчанию) |
Место хранения | Куча | Стек/куча | Куча |
Наследование | Да | Нет | Да |
Изменяемость | Да | Да | Нет (по умолчанию) |
Сравнение | По ссылке | По значению | По значению |
Когда использовать
- Классы подходят для работы с изменяемыми объектами, особенно если важна поддержка наследования.
- Структуры лучше использовать для небольших объектов, которые не изменяются после создания и часто копируются.
- Записи удобны для неизменяемых объектов, например, DTO (Data Transfer Object) и моделей данных.
Выбор между классами, структурами и записями зависит от задач проекта и требований к производительности, изменяемости и семантике сравнения.