为什么是System.绘制矩形,点,大小等可变结构体,而不是类
本文关键字:结构体 小等 绘制 System 为什么 | 更新日期: 2023-09-27 17:50:49
微软决定制作这些结构体有什么原因吗?
这三个都是可变的。如果它们是不可变的,或者是引用类型,我会发现处理它们会容易得多。
如果它们必须是结构体,为什么它们是可变的?
为什么它们是struct
< 值语义/strong>
这些值的两个相同实例之间没有本质的区别。任何具有坐标的Point
, [2,3]
等于具有相同坐标的任何其他点,就像任何两个具有相似值的int
是相等的一样。这是符合设计准则的:
逻辑上表示单个值,类似于基本类型(整型、双精度等)。
性能strong>
值类型的分配和释放成本更低。
通常需要创建这些值的许多实例。创建结构的成本更低,如果它们是局部值,它们将在堆栈上创建,从而减轻GC的压力。
让我们考虑一下这些值的大小:Point
: 8 bytesSize
: 8 bytesRectangle
: 16 bytes
对于Point
和Size
,它们的大小与对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
失败的唯一原因是,为了提供迭代, (感谢Rajeev)迭代器按值返回数据,你只会对值的副本进行更改。p
被装箱到object
,而你的Cannot modify the result of an unboxing conversion
,
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)
时分配一个新的内存部分?