为什么是System.绘制矩形,点,大小等可变结构体,而不是类

本文关键字:结构体 小等 绘制 System 为什么 | 更新日期: 2023-09-27 17:50:49

微软决定制作这些结构体有什么原因吗?

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

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

为什么是System.绘制矩形,点,大小等可变结构体,而不是类

为什么它们是struct

<

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

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

值类型的分配和释放成本更低。

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


让我们考虑一下这些值的大小:
Point: 8 bytes
Size: 8 bytes
Rectangle: 16 bytes

对于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; 
}

这个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存储4个整数的集合。
  • Point Structure表示一对有序的整数x坐标和y坐标。
  • Size Structure存储有序整数对。

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

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

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