JavaRush /Курси /C# SELF /Структури в C#

Структури в C#

C# SELF
Рівень 10 , Лекція 2
Відкрита

1. Вступ

Структура — це особливий тип даних у C#, який дозволяє об’єднати кілька значень (навіть різних типів) в одну «коробку». Це як маленький конструктор LEGO: ви складаєте деталі, а на виході отримуєте зручний, компактний об’єкт.

Структури схожі на класи, але мають свої особливості. Їх використовують для простіших випадків, коли не потрібна вся потужність і «вага» класів.

Синтаксис


struct Point
{
    public int X;
    public int Y;
}
Оголошення структури Point

У цьому прикладі ми описали структуру для точки на площині з координатами X та Y.

Де використовуються структури?

Найчастіше структури використовують для невеликих, простих об’єктів, які мають бути дуже легкими й «лише даними».

У C# деякі стандартні типи — структури:

  • int, double, bool, DateTime, TimeSpan, decimal, Guid
  • і навіть ConsoleKeyInfo або Point (у графічних бібліотеках)

Відмінності структур від класів

Критерій Структура Клас
Ключове слово
struct
class
Тип зберігання 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...
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ