Разница между структурой, классом и записью в C#

В 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);

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

ХарактеристикаClassStructRecord
ТипСсылочныйЗначимыйСсылочный (по умолчанию)
Место храненияКучаСтек/кучаКуча
НаследованиеДаНетДа
ИзменяемостьДаДаНет (по умолчанию)
СравнениеПо ссылкеПо значениюПо значению

Когда использовать

  • Классы подходят для работы с изменяемыми объектами, особенно если важна поддержка наследования.
  • Структуры лучше использовать для небольших объектов, которые не изменяются после создания и часто копируются.
  • Записи удобны для неизменяемых объектов, например, DTO (Data Transfer Object) и моделей данных.

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