为什么System.Drawing Rectangle,Point,Size等可变结构而不是类?

Fla*_*ash 15 .net c# design-decisions

微软是否有理由决定制作这些结构?

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

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

Rot*_*tem 19

他们为什么要结构

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

它逻辑上表示单个值,类似于基本类型(整数,双精度等).

性能

值类型分配和取消分配更便宜.

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

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

对于PointSize,它们的大小与对64位系统中的类实例的引用相同.

根据Microsoft的指导原则引用:在类和结构之间进行选择

为什么他们是可变的

这些结构是完全可变的.为了性能,这是完成的(违反指南),因为它避免了为修改操作创建新值的需要.

关于评论中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; 
}
Run Code Online (Sandbox Code Playgroud)

这种情况的唯一原因foreach失败了,是因为p装箱object以提供迭代,而你Cannot modify the result of an unboxing conversion,(感谢拉杰夫)的迭代器值返回数据,而你只会在更改复制的价值.

这很好用:

for (int i = 0; i < points.Length; i++)
{
    points[i].X += 1;
}
Run Code Online (Sandbox Code Playgroud)