Почему System.Drawing Rectangle, Point, Size и т.д. Изменяемые структуры, а не классы? - программирование

Почему System.Drawing Rectangle, Point, Size и т.д. Изменяемые структуры, а не классы?

Есть ли причина, по которой Microsoft решила создать эти структуры?

Все три изменяемы. Я бы нашел их гораздо легче справиться, если они были либо неизменными, либо если они были ссылочными типами.

Если есть причины, они должны быть структурами, почему они изменяемы?

4b9b3361

Ответ 1

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

Ценностная семантика
Между двумя идентичными экземплярами этих значений нет существенной разницы. Любой Point с координатами [2,3] равен любой другой точке с теми же координатами, как и любые два int со сходным значением. Это соответствует руководству по проектированию:

Он логически представляет одно значение, подобное примитивным типам (целое, двойное и т.д.).

Производительность

Типы значений дешевле выделять и освобождать.

Часто возникает потребность в создании многих экземпляров этих значений. Структуры стоят меньше для создания, и если они являются локальными значениями, они будут созданы в стеке, сбросив давление из GC.

Размер
Рассмотрим размер этих значений:
Point: 8 байт
Size: 8 байт
Rectangle: 16 байт

Для Point и Size их размер такой же, как ссылка на экземпляр класса, будет в 64-битном система.

Цитаты из рекомендаций Microsoft: Выбор между классами и структурами

Почему они Mutable

Эти структуры полностью изменяемы. Это делается (против рекомендаций) ради производительности, поскольку это позволяет избежать необходимости создавать новые значения для операций модификации.

Что касается примера кода OP в комментариях:

Point[] points = new Point[] { new Point(0,0), new Point(1,1), new Point(2,2) };

foreach (Point p in points)
{
    p.X += 1; 
}

Единственная причина, по которой этот foreach терпит неудачу, заключается в том, что p в коробке до object для обеспечения итерации, а вы Cannot modify the result of an unboxing conversion, ( спасибо Rajeev), то итератор возвращает данные по значению, и вы только вносите изменения в копию значения.

Это отлично работает:

for (int i = 0; i < points.Length; i++)
{
    points[i].X += 1;
}

Ответ 2

Microsoft не нужно определять эти структуры как класс.

Это в основном небольшие структуры.

  • Rectangle Structure хранит набор из четырех целых чисел.
  • Point Structure представляет собой упорядоченную пару целых x- и y-координат.
  • Size Structure хранит упорядоченную пару целых чисел.

Если они определены как структура class, для Point, те же самые координаты могут ссылаться на разные объекты в памяти. Определяя как struct, мы знаем, что нет разницы между разными точками с одинаковыми координатами. Это означает, что они являются типами значений. Типы значений почти всегда дешевле выделять. Посмотрите их размер;

Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes

Кто хочет выделить новую часть памяти каждый раз при создании Point(1,2)?