15

微软决定制作这些结构是有原因的吗?

这三个都是可变的。如果它们是不可变的,或者它们是引用类型,我会发现它们更容易处理。

如果有理由它们必须是结构,为什么它们是可变的?

4

2 回答 2

20

为什么它们是结构

值语义
这些值的两个相同实例之间没有本质区别。任何Point具有坐标的点,[2,3]都等于具有相同坐标的任何其他点,就像任何int具有相似值的两个 s 相等一样。这符合设计指南:

它在逻辑上表示单个值,类似于原始类型(整数、双精度等)。

表现

值类型的分配和解除分配成本更低。

通常需要创建这些值的许多实例。struct 的创建成本更低,如果是本地值,它们将在堆栈上创建,从而减轻 GC 的压力。

大小
让我们考虑这些值的大小:
Point: 8 字节
Size: 8 字节
Rectangle: 16 字节

对于PointSize,它们的大小与在 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失败的唯一原因是因为p装箱object提供迭代,而您Cannot modify the result of an unboxing conversion感谢 Rajeev)迭代器按值返回数据,您只会更改值的副本

这工作正常:

for (int i = 0; i < points.Length; i++)
{
    points[i].X += 1;
}
于 2013-01-07T08:55:18.677 回答
2

Microsoft 不需要将这些结构定义为一个类。

这些基本上是小型结构。

如果将这些定义为class, forPoint结构,则相同的坐标可以引用内存中的不同对象。定义为struct,我们知道具有相同坐标的不同点之间没有区别。这意味着它们是值类型。值类型的分配几乎总是更便宜。看看它们的大小;

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

谁想在每次创建时分配一个新的内存部分Point(1,2)

于 2013-01-07T09:01:12.483 回答