Создание инкапсулированных данных с помощью структур в C#

Завершено

При работе над проектом по отслеживанию сведений о заказе, нужно объединить связанные сведения: имя клиента, адрес доставки и общую сумму заказа. Структуры в C# позволяют создать базовый инкапсулированный контейнер для этих данных, что упрощает работу и передачу в виде одной единицы.

Понимание структур

Структуры — это типы значений в C#, то есть они хранят данные напрямую, а не ссылаются на них. Ключевое struct слово используется для определения структуры. Структуры обычно используются для небольших, ориентированных на данные типов, которые обеспечивают минимальное поведение.

  • Структуры имеют семантику значений, то есть их значения копируются во время вызовов назначения или метода.
  • Распространенные варианты использования включают числа, логические значения, символы и экземпляры времени.
  • Структуры обычно используются для представления упрощенных данных, таких как геометрические фигуры (например, Rectangle, ), Circleкоординаты или параметры конфигурации.

Структуры лучше всего подходят для небольших, неизменяемых и критически важных для производительности данных. Для более крупных, более сложных объектов или когда поведение является центральным аспектом, вместо этого рассматривайте возможность использования классов. В отличие от классов, структуры не могут наследоваться от других структур или классов, но они могут реализовывать интерфейсы.

Подсказка

Если тип фокусируется на поведении, а не на данных, классы часто лучше выбирать из-за их ссылочной семантики.

Определение и реализация структуры

public struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

В примере кода показано, как определить структуру с полями и конструктором в C#.

Структуры также могут реализовывать интерфейсы, но не могут наследоваться от других классов или структур.

Инкапсулировать данные в структурах

Инкапсуляция позволяет управлять доступом к данным в структуре. Используйте модификаторы доступа, такие как private, public или internal, чтобы указать доступность.

  • Поля и свойства можно сделать закрытыми для ограничения прямого доступа.
  • Методы могут предоставлять управляемые способы взаимодействия с данными.

Рассмотрим пример.

public struct Rectangle
{
    private int width;
    private int height;

    public Rectangle(int width, int height)
    {
        this.width = width;
        this.height = height;
    }

    public int Area => width * height;
}

Пример кода демонстрирует структуру в C# с инкапсулированными полями и вычисляемого свойства для области.

Применение модификатора readonly к структурам для обеспечения их неизменяемости.

Неизменяемость гарантирует, что после создания структуры его данные не могут быть изменены. Структуру полезно использовать при работе с данными, которые должны оставаться постоянными в течение всего времени существования, например координат или значений конфигурации. При применении модификатора readonly к структуре, вы можете обеспечить её неизменяемость, что делает ваш код более предсказуемым и менее подверженным ошибкам, вызванным непреднамеренными изменениями.

public readonly struct ImmutablePoint
{
    public int X { get; init; }
    public int Y { get; init; }

    public ImmutablePoint(int x, int y)
    {
        X = x;
        Y = y;
    }
}

Пример кода демонстрирует использование readonly модификатора для создания неизменяемой структуры в C#.

Примечание.

Хотя сама структура неизменяема, изменяемые типы ссылок в нем по-прежнему могут изменить свое состояние.

Использование инициализаторов объектов со структурами

При работе с структурами часто необходимо инициализировать несколько свойств. Инициализаторы объектов предоставляют простой и доступный для чтения способ создания и инициализации экземпляров структуры на одном шаге. Такой подход уменьшает повторяющийся код и делает намерение понятным.

Следующий пример кода определяет структуру со свойствами, которые группируют связанные данные вместе и упрощают инициализацию и работу с экземплярами структуры.

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

С помощью инициализатора объектов можно создать и инициализировать Point:

var point = new Point { X = 10, Y = 20 };

В примере кода показано, как использовать инициализатор объектов для задания значений свойств при создании экземпляра структуры.

Подсказка

Инициализаторы объектов упрощают чтение кода при работе с структурой с несколькими свойствами.

Практический пример. Использование структур для представления точек в 2D-пространстве

Структуры часто используются для представления небольших неизменяемых структур данных. Например, можно использовать структуру для представления точки в 2D-пространстве и вычисления расстояния между двумя точками:

public struct Point
{
    public int X { get; }
    public int Y { get; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    public double DistanceTo(Point other)
    {
        int dx = X - other.X;
        int dy = Y - other.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

var point1 = new Point(3, 4);
var point2 = new Point(7, 1);
Console.WriteLine($"Distance between points: {point1.DistanceTo(point2)}");

В этом примере показано, как определить структуру для точки, вычислить расстояние между двумя точками и использовать структуру в простой программе.

Объединение инкапсуляции, неизменяемости и инициализаторов объектов позволяет создавать структуры, которые являются эффективными и предсказуемыми. Эти функции помогают управлять связанными данными в чистом и упорядоченном виде.