Ответ 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
терпит неудачу, заключается в том, что ( спасибо Rajeev), то итератор возвращает данные по значению, и вы только вносите изменения в копию значения.p
в коробке до object
для обеспечения итерации, а вы Cannot modify the result of an unboxing conversion
,
Это отлично работает:
for (int i = 0; i < points.Length; i++)
{
points[i].X += 1;
}