В объектно-ориентированном программировании на C# разработчики часто работают с двумя основными видами типов: ссылочными (class) и значимыми (struct). Если классы являются основой ООП, то структуры (struct) представляют собой лёгкий и эффективный механизм для создания небольших объектов-значений.
Структуры используются, когда нужно хранить небольшие объёмы данных с семантикой значения (value semantics). Они позволяют повысить производительность приложения за счёт размещения в стеке, а не в куче. В этой статье мы подробно разберём, что такое структуры в C#, как их объявлять, инициализировать и использовать.
Определение структуры
Структура объявляется с помощью ключевого слова struct:
public struct Point
{
public int X;
public int Y;
}
Структура — это значимый тип (value type). В отличие от класса, при присваивании или передаче в метод копируется всё содержимое структуры, а не ссылка.
Создание объекта структуры
Создать экземпляр структуры можно несколькими способами:
// Способ 1: с использованием конструктора по умолчанию
Point p1 = new Point();
// Способ 2: объявление и последующая инициализация
Point p2;
p2.X = 10;
p2.Y = 20;
// Способ 3: инициализация через объектный инициализатор
Point p3 = new Point { X = 5, Y = 15 };
Важно: до C# 10 нельзя было использовать new Point() без явной инициализации всех полей. Начиная с C# 10, это разрешено.
Инициализация полей по умолчанию
Все поля структуры при создании через new автоматически инициализируются значениями по умолчанию:
- Числовые типы → 0
- bool → false
- Ссылочные типы → null
- enum → 0
- DateTime → 01.01.0001
Point p = new Point();
Console.WriteLine(p.X); // 0
Console.WriteLine(p.Y); // 0
Непосредственная инициализация полей
С C# 10+ появилась возможность определять инициализацию полей по умолчанию прямо в объявлении структуры:
public struct Rectangle
{
public int Width = 10; // значение по умолчанию
public int Height = 20;
public Rectangle() { } // конструктор без параметров теперь разрешён
}
Теперь можно создавать структуру так:
var rect = new Rectangle();
Console.WriteLine(rect.Width); // 10
Конструкторы структур
Структуры имеют ряд особенностей по сравнению с классами:
- Конструктор без параметров до C# 10 был запрещён явно (компилятор всегда предоставлял скрытый). С C# 10 его можно объявлять.
- Все конструкторы должны инициализировать все поля структуры.
- Структуры не поддерживают наследование (нельзя использовать : BaseStruct).
Пример параметрического конструктора:
public struct Point
{
public int X;
public int Y;
// Конструктор с параметрами
public Point(int x, int y)
{
X = x;
Y = y;
}
}
// Использование
Point p = new Point(7, 12);
Конструктор копирования (с C# 12):
public struct Point
{
public int X { get; init; }
public int Y { get; init; }
public Point(Point other)
{
X = other.X;
Y = other.Y;
}
}
Дополнительные возможности структур
Readonly struct — рекомендуется использовать, если структура не должна изменяться:
public readonly struct Vector
{
public readonly double X;
public readonly double Y;
public Vector(double x, double y) => (X, Y) = (x, y);
}
Ref struct — структура, которая может существовать только в стеке (нельзя использовать в полях классов, в замыканиях и т.д.):
public ref struct Span<T>
{
// ...
}
Когда использовать структуры:
- Координаты (Point, Vector)
- Дата и время (DateTime, TimeSpan)
- Числовые типы с дополнительной логикой
- Небольшие неизменяемые данные
Когда лучше использовать классы:
- Большие объекты
- Объекты с идентичностью (Entity)
- Когда нужна полиморфность и наследование
Структуры в C# — мощный инструмент для создания эффективных и производительных приложений. Они сочетают в себе удобство объектно-ориентированного подхода с семантикой значений и высокой производительностью.
Ключевые моменты статьи:
- Структуры — значимые типы, копируются по значению.
- С C# 10+ значительно расширились возможности инициализации и конструкторов.
- Правильное использование readonly struct помогает писать безопасный и производительный код.
Понимание различий между class и struct — важный шаг в освоении C# и написании качественного, оптимизированного кода.
0 Комментарий(я)
Зарегистрируйтесь чтобы оставить комментарий