Почему изменяемые структуры 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)
?