我读到System.Drawing.Point是一个值类型。我不明白。为什么?
答案 0 :(得分:9)
微软试图遵循这些规则,他们在MSDN中解释得非常好,请参阅Choosing Between Classes and Structures(The book更好,因为它有很多有趣的评论)
即使Point不是这么好的样本:
正如我所说,我猜他们没有尊重“不可变”的部分是因为没有规定System.Drawing的编写和速度,因为图形操作可能对此非常敏感。
我不知道他们是否正确,也许他们测量了一些常见的算法,发现他们在分配临时对象和复制它们时失去了太多的性能。无论如何,只有在仔细测量类/结构的实际使用情况后才能进行这样的优化。
答案 1 :(得分:2)
这是一个Structure。就像DateTime一样。结构是价值类型。
答案 2 :(得分:2)
原因几乎可以肯定,System.Drawing.Point(和PointF)类型用于绘制.NET GDI(+)Wrappers,这需要编组。编组值类型(即结构)以便Native库可以使用它们比编组堆分配的对象(即类)更快。
来自MSDN(Performance Considerations for Run-Time Technologies in the .NET Framework ):
值得注意的一件非常重要的事情是ValueTypes在互操作场景中不需要编组。由于编组是与本机代码互操作时性能最高的一个,因此使用ValueTypes作为本机函数的参数可能是您可以做的最大性能调整。
答案 3 :(得分:0)
好吧,我并不是特别了解微软的原因,但这是有道理的。它是一个固定大小的结构,包含少量不可变数据。我宁愿在堆栈上分配这样的东西,它易于分配并且易于免费。将它作为一个类并将其放在堆上意味着它必须由GC管理,这会为这样一个微不足道的事情带来大量的开销。
答案 4 :(得分:0)
在C#中,struct
类型被视为值类型,以允许用户定义的值类型。这是Drawing.Point。