Гид по технологиям

Struct (структура) в C#: объявление, примеры и отличия

4 min read C++ Обновлено 07 Jan 2026
Struct в C#: объявление, примеры, отличия
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

Существует два основных способа создать переменную структуры.

  1. С помощью конструктора:
Game game1 = new Game("Pokémon GO", "Краткое описание игры.", 50);
  1. Объявить переменную и присвоить поля по отдельности:
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 объектов.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство