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

В объектно-ориентированном программировании на 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# и написании качественного, оптимизированного кода.

Лого

Spartacus_85 [Admin]

Администратор сайта — это специалист, который отвечает за техническую поддержку и бесперебойную работу веб-ресурса.



0 Комментарий(я)

Зарегистрируйтесь чтобы оставить комментарий