微软决定制作这些结构是有原因的吗?
这三个都是可变的。如果它们是不可变的,或者它们是引用类型,我会发现它们更容易处理。
如果有理由它们必须是结构,为什么它们是可变的?
微软决定制作这些结构是有原因的吗?
这三个都是可变的。如果它们是不可变的,或者它们是引用类型,我会发现它们更容易处理。
如果有理由它们必须是结构,为什么它们是可变的?
值语义
这些值的两个相同实例之间没有本质区别。任何Point
具有坐标的点,[2,3]
都等于具有相同坐标的任何其他点,就像任何int
具有相似值的两个 s 相等一样。这符合设计指南:
它在逻辑上表示单个值,类似于原始类型(整数、双精度等)。
表现
值类型的分配和解除分配成本更低。
通常需要创建这些值的许多实例。struct 的创建成本更低,如果是本地值,它们将在堆栈上创建,从而减轻 GC 的压力。
大小
让我们考虑这些值的大小:
Point
: 8 字节
Size
: 8 字节
Rectangle
: 16 字节
对于Point
和Size
,它们的大小与在 64 位系统中对类实例的引用相同。
引用自微软指南:在类和结构之间选择
这些结构是完全可变的。这样做(违反指南)是为了提高性能,因为它避免了为修改操作创建新值的需要。
关于评论中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;
}
这些基本上是小型结构。
Rectangle Structure
存储一组四个整数。Point Structure
表示整数 x 和 y 坐标的有序对.Size Structure
存储一个有序的整数对。如果将这些定义为class
, forPoint
结构,则相同的坐标可以引用内存中的不同对象。定义为struct
,我们知道具有相同坐标的不同点之间没有区别。这意味着它们是值类型。值类型的分配几乎总是更便宜。看看它们的大小;
Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes
谁想在每次创建时分配一个新的内存部分Point(1,2)
?