Struct (структура) в C#: объявление, примеры и отличия
Что такое struct
Struct (структура) в C# — это value-тип. Value-тип хранит данные напрямую. Коротко: value-тип копируется при присвоении, а ссылочный тип (class) передаёт ссылку на объект.
Определение в одну строку: struct — тип данных, ориентированный на хранение состояния, а не на сложное поведение.
Важно: структуры не поддерживают наследование и могут иметь только ограниченный набор особенностей, доступных классам.
Как объявить struct
Для объявления структуры используется ключевое слово struct. Перед ним обычно ставят модификатор доступа, затем имя и фигурные скобки. Пример объявления структуры Game:
public struct Game {}Как заполнить struct (поля, конструктор, методы)
Структура хранит поля, конструкторы, методы и события так же, как класс, но с семантикой value-типа. Пример структуры Game с полями, конструктором и переопределением ToString():
public struct Game
{
public string name;
public string description;
public int levels;
public Game(string name, string description, int levels)
{
this.name = name;
this.description = description;
this.levels = levels;
}
public override string ToString() => $"Name: {name}, Description: {description}, Levels: {levels}";
}Пояснения:
- Поля хранят состояние.
- Конструктор инициализирует поля при создании экземпляра.
- Метод ToString() форматирует представление структуры.
Как создать переменную struct
Существует два основных способа создать переменную структуры.
- С помощью конструктора:
Game game1 = new Game("Pokémon GO", "Краткое описание игры.", 50);- Объявить переменную и присвоить поля по отдельности:
Game game1;
game1.name = "Pokémon GO";
game1.description = "Краткое описание игры.";
game1.levels = 50;В обоих случаях вы получите рабочий экземпляр структуры и можете вызвать его методы:
Console.WriteLine(game1.ToString());Вывод в консоль:
Name: Pokémon GO, Description: Краткое описание игры., Levels: 50Отличия struct и class
Кратко:
- Struct — value-тип; class — ссылочный тип.
- Struct копируется при присвоении; class копирует ссылку.
- Struct не поддерживает наследование (нет базовых/производных типов).
- Struct не может иметь null-ссылку (за исключением Nullable
), class может.
Практический эффект: передача struct в метод копирует данные (может быть дорого для больших структур). Передача class передаёт ссылку на одно и то же место в памяти.
Когда использовать struct и когда не стоит
Рекомендуется использовать struct, когда:
- Тип небольшой и представляется набором полей (например, координаты, цвет, дата/время — небольшие объекты).
- Объект логически ведёт себя как значение (immutable — неизменяемые данные).
- Не нужна поддержка наследования и полиморфизма.
Не используйте struct, когда:
- Объект большой по размеру (частые копирования повысят нагрузку).
- Нужна сложная логика, состояние и поведение, управляемое ссылками.
- Необходима совместная изменяемая ссылка на один объект.
Important: Даже если структура «работает», большие структуры могут снизить производительность из‑за копирования при передаче по значению.
Контрпримеры — когда struct ошибочен
- Модели домена с множеством полей и методами. Лучше класс.
- Объекты с жизненным циклом, разделяемые между компонентами (shared mutable state).
- Когда требуется наследование или виртуальные методы.
Эвристики и ментальные модели
- Модель «значение против ссылки»: представьте, что присваиваете число — это копия; присваиваете ссылку — это как ярлык на объект.
- Правило большого пальца: используйте struct для небольших, простых и предпочтительно неизменяемых данных.
- Если сомневаетесь — используйте класс; ошибки с классами реже приводят к неожиданным копированиям.
Шпаргалка по принятию решения (мини‑алгоритм)
flowchart TD
A[Небольшой объект?] -->|Да| B[Логически значение 'value'?]
A -->|Нет| G[Использовать class]
B -->|Да| C[Нужен ли полиморфизм?]
C -->|Да| G
C -->|Нет| D[Объект неизменяем?]
D -->|Да| E[Использовать struct]
D -->|Нет| F[Рассмотреть class или readonly struct]Чеклист для ролей
- Разработчик:
- Проверить размер структуры и частоту копирования.
- Оценить необходимость наследования.
- Архитектор:
- Решить, являются ли типы доменными значениями или сущностями.
- Тестировщик:
- Тесты на копирование и поведение при присвоении.
Короткий глоссарий
- Value-тип: тип, экземпляры которого копируются по значению.
- Ссылочный тип: тип, где переменные хранят ссылку на объект в куче.
- Immutable: неизменяемый объект; полезен для структур.
Примеры тестов / приёмки
- Присваивание одной структуры в другую не должно изменять исходную.
- Передача структуры в метод по значению не должна влиять на оригинал, если метод не использует ref/out.
Итог
Struct — полезный инструмент в C# для небольших, данных‑ориентированных типов. Они экономны и просты, когда используются по назначению. Для больших, поведенческих или наследуемых объектов лучше применять классы.
Ключевые выводы:
- Struct — value-тип, копируется при присвоении.
- Не поддерживает наследование и null по умолчанию.
- Хорош для небольших и неизменяемых значений; избегайте для больших mutable объектов.
Примечание: при выборе учитывайте не только семантику, но и производительность в контексте вашего приложения.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone