Создание инкапсулированных данных с помощью структур в 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)}");
В этом примере показано, как определить структуру для точки, вычислить расстояние между двумя точками и использовать структуру в простой программе.
Объединение инкапсуляции, неизменяемости и инициализаторов объектов позволяет создавать структуры, которые являются эффективными и предсказуемыми. Эти функции помогают управлять связанными данными в чистом и упорядоченном виде.