Структуры в C#: определение, особенности и отличия от классов
Что такое структура
Структура (struct) — это тип-значение (value type). Она позволяет одной переменной хранить связанные данные разных типов. Ключевое слово — struct.
Структуры используются для представления легковесных записей (record-like data).
Объявление структуры
struct Books
{
public string Title;
public string Author;
public string Subject;
public int BookId;
}
Использование структуры
Books book1;
book1.Title = "C Programming";
book1.Author = "Nuha Ali";
book1.Subject = "C Programming Tutorial";
book1.BookId = 6495407;
// Можно инициализировать через конструктор (если определён)
Books book2 = new Books { Title = "Telecom", Author = "Zara", Subject = "Billing", BookId = 6495700 };
Особенности структур в C#
- Могут содержать: методы, поля, индексаторы, свойства, операторы, события
- Могут иметь конструкторы с параметрами, но не могут иметь деструкторов и не могут объявлять конструктор без параметров (неявный конструктор по умолчанию всегда инициализирует поля нулями/null)
- Не поддерживают наследование от других структур или классов (но неявно наследуются от
System.ValueType→object) - Не могут быть базовыми для других классов/структур
- Могут реализовывать интерфейсы
- Члены не могут быть
abstract,virtual,protected - При создании через
newвызывается конструктор; безnew— поля остаются неинициализированными (нельзя использовать до инициализации всех полей) - Хранятся в стеке (обычно), копируются по значению при присваивании/передаче в методы
Структура vs Класс
| Характеристика | Class (класс) | Struct (структура) |
|---|---|---|
| Тип | Reference type | Value type |
| Наследование | Поддерживается | Не поддерживается (только интерфейсы) |
| Конструктор по умолчанию | Можно переопределить | Нельзя объявлять (всегда неявный) |
| Деструктор | Можно | Нельзя |
| Null | Может быть null | Не может быть null (если не Nullable<T>) |
| Присваивание | Копируется ссылка | Копируется значение (все поля) |
| Производительность | Нагрузка на GC, куча | Стек, нет GC, быстрее для малых объектов |
Пример со свойствами и методами
using System;
struct Books
{
private string title;
private string author;
private string subject;
private int bookId;
// Конструктор с параметрами
public Books(string t, string a, string s, int id)
{
title = t; author = a; subject = s; bookId = id;
}
public void GetValues(string t, string a, string s, int id)
{
title = t; author = a; subject = s; bookId = id;
}
public void Display()
{
Console.WriteLine($"Title: {title}");
Console.WriteLine($"Author: {author}");
Console.WriteLine($"Subject: {subject}");
Console.WriteLine($"Book_id: {bookId}");
}
}
class Program
{
static void Main()
{
Books book1 = new Books("C Programming", "Nuha Ali", "C Tutorial", 6495407);
Books book2 = new Books();
book2.GetValues("Telecom", "Zara Ali", "Billing", 6495700);
book1.Display();
book2.Display();
}
}
Когда использовать структуру
- Малые, неизменяемые данные (координаты, цвет, дата, деньги)
- Когда нужно избежать накладных расходов на кучу и GC
- Когда семантика копирования по значению естественна
- При реализации интерфейсов для value-type семантики
Когда использовать класс
- Сложные объекты с идентичностью (entity)
- Нужно наследование
- Нужны finalizers / сложная логика очистки
- Большие объекты (копирование по значению дорого)
- Полиморфизм
Record structs (C# 10+)
Для неизменяемых структур с value-семантикой равенства:
public readonly record struct Point(int X, int Y);
Язык C
- Структуры C++ против классов: практическое руководство для разработчиков встроенных систем
- Семафоры в Nucleus RTOS: Утилитарные сервисы и структуры данных
- Рецензия: «Оцифровывайся или умирай» — блупринт для IoT-драйвенной трансформации
- Сохранение человечности в эпоху разрушительных технологий
- Революция в хранилищах данных: магнитные наноструктуры с мантиями невидимости нового поколения
- Топ-17 книг по программированию для прокачки навыков кодинга в 2021 году
- Структуры данных в Java: основные классы и Collections Framework
- Структуры в C (struct): определение, инициализация, передача в функции, указатели и битовые поля
- typedef в C: создание псевдонимов типов, упрощение кода и отличия от #define
- Структуры данных в C++: массивы, структуры и эффективное программирование