System.Drawing.Point是一种值类型。为什么?

时间:2009-11-02 00:27:21

标签: c# .net types

我读到System.Drawing.Point是一个值类型。我不明白。为什么?

5 个答案:

答案 0 :(得分:9)

微软试图遵循这些规则,他们在MSDN中解释得非常好,请参阅Choosing Between Classes and StructuresThe book更好,因为它有很多有趣的评论)

即使Point不是这么好的样本:

  • Struct应逻辑上表示单个值(在这种情况下是一个位置,即使它有2个组件,但复数也可以分为2个部分,它们是结构的主要候选者)
  • Struct的实例大小应小于16个字节。 (好的,2x4 = 8)
  • 不应经常将结构框装入。 (好的,这是对的)
  • 但是,结构应该是不可变的(这里是他们不遵循自己的规则的部分,但我想微观优化在规则上获得,无论如何都是后来写的)< / LI>

正如我所说,我猜他们没有尊重“不可变”的部分是因为没有规定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。

的情况