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})");

Когда лучше использовать структуру?

  • Для небольших “сборок” данных (например, координата, цвет, диапазон, дата и время).
  • Когда важна компактность и производительность (например, миллионы точек в массиве).
  • Когда объект должен вести себя как единое значение (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...
2
Задача
C# SELF, 10 уровень, 2 лекция
Недоступна
Создание простой структуры для хранения координат точки
Создание простой структуры для хранения координат точки
2
Задача
C# SELF, 10 уровень, 2 лекция
Недоступна
Структура с конструктором и методом расчёта площади
Структура с конструктором и методом расчёта площади
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Serhii Pypa Уровень 63
27 октября 2025
Раньше в конструкторах структур требовалось обязательно инициализировать все поля, иначе компилятор выдавал ошибку. Начиная с современных версий C# (с 10), разрешено оставлять неинициализированные поля, если это допустимо по логике. struct MyStruct { public int X; public int Y; public MyStruct(int x) { // Например, в данном случае поле Y не инициализируется явно, но это больше не ошибка. X = x; } }