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

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

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

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

2 ответа

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

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

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

Спектакль

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

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

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

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

Цитаты взяты из руководств Microsoft: выбор между классами и структурами

Почему они изменчивы

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам