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})");
Коли краще використовувати структуру?
- Для невеликих «збірок» даних (наприклад, координата, колір, діапазон, дата й час).
- Коли важлива компактність і продуктивність (наприклад, мільйони точок у масиві).
- Коли об’єкт має поводитися як єдине значення (під час копіювання працює саме копія!).
Не варто використовувати структуру, якщо об’єкт:
- Може бути великим (багато полів).
- Має брати участь в ієрархії успадкування.
- Має часто змінюватися за посиланням.
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...
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ