1. Введение
Структура — это особый тип данных в C#, который позволяет объединить несколько значений (даже разных типов) в одну “коробку”. Это как небольшой конструктор LEGO: вы складываете детали, а на выходе получаете удобный, компактный объект.
Структуры похожи на классы, но у них есть особенности, и они применяются для более “простых” случаев, когда не нужна вся мощь и “тяжесть” классов.
Синтаксис
struct Point
{
public int X;
public int Y;
}
В этом примере мы описали структуру для точки на плоскости с координатами X и Y.
Где используются структуры?
Чаще всего структуры используют для небольших, простых объектов, которые должны быть очень легкими и “просто данными”.
В C# некоторые стандартные типы — структуры:
- int, double, bool, DateTime, TimeSpan, decimal, Guid
- и даже, например, ConsoleKeyInfo или Point (в графических библиотеках)
Отличия структур от классов
| Критерий | Структура | Класс |
|---|---|---|
| Ключевое слово | |
|
| Тип хранения | Value Type | Reference Type |
| Хранится в | Стеке (область в памяти) | Куче (область в памяти) |
| Передача в метод | По значению (копия) | По ссылке |
| Наследование | Нет (кроме интерфейсов) | Да |
| Может быть null | Нет (только Nullable) | Да |
| По умолчанию | Неявная инициализация всех полей нулями | Только через конструктор |
2. Объявление и использование структур
Объявить структуру можно внутри или вне класса:
struct Rectangle
{
public int Width;
public int Height;
}
Создание и использование:
Rectangle r;
r.Width = 10;
r.Height = 5;
Console.WriteLine($"Площадь: {r.Width * r.Height}");
Также можно использовать конструктор:
struct Point
{
public int X;
public int Y;
// Конструктор
public Point(int x, int y)
{
X = x;
Y = y;
}
}
var p = new Point(3, 7);
Console.WriteLine($"Точка: ({p.X}, {p.Y})");
Когда лучше использовать структуру?
- Для небольших “сборок” данных (например, координата, цвет, диапазон, дата и время).
- Когда важна компактность и производительность (например, миллионы точек в массиве).
- Когда объект должен вести себя как единое значение (copy-paste — работает именно копия!).
Не стоит использовать структуру, если объект:
- Может быть большим (много полей).
- Должен участвовать в иерархии наследования.
- Должен часто изменяться по ссылке.
3. Особенности и “ловушки” структур
Копирование
Point p1 = new Point(1, 2);
Point p2 = p1; // создаётся КОПИЯ!
p2.X = 100;
Console.WriteLine(p1.X); // 1 — не изменился!
Console.WriteLine(p2.X); // 100
Неявные значения по умолчанию
Point p; // поля X и Y = 0, даже если не присваивали явно!
Может быть Nullable
Чтобы хранить null, нужно использовать специальный nullable-синтаксис — после имени типа поставить вопросительный знак. Тогда можно будет переменной присваивать null.
Point? p = null;
if (p == null)
Console.WriteLine("Нет точки");
4. Структуры с автоматическими свойствами и методами
Структуры могут иметь методы, свойства, события и даже статические члены.
public struct Range
{
public int Start { get; set; }
public int End { get; set; }
public int Length => End - Start;
public override string ToString() => $"[{Start}..{End}]";
}
Пример: структура для комплексных чисел
Структура для комплексных чисел с методом и переопределением ToString()
struct Complex
{
public double Re;
public double Im;
public Complex(double re, double im)
{
Re = re;
Im = im;
}
public double Abs() => Math.Sqrt(Re * Re + Im * Im);
public override string ToString() => $"{Re} + {Im}i";
}
var z = new Complex(1, 2);
Console.WriteLine(z); // 1 + 2i
Console.WriteLine(z.Abs()); // 2.236...
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ