繁体   English   中英

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

[英]System.Drawing.Point is a value type. Why?

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

微软试图遵循这些规则,他们在MSDN中很好地解释它们,参见在类和结构之间选择这本书更好,因为它有很多有趣的评论)

即使Point不是这样的好例子:

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

正如我所说,我猜他们没有尊重“不可变”部分的事实是因为在编写System.Drawing时没有规则,因为图形操作可能对此非常敏感。

我不知道他们是否正确,也许他们测量了一些常见的算法,发现他们在分配临时对象和复制它们时失去了太多的性能。 无论如何,只有在仔细测量类/结构的实际使用之后才能进行这种优化。

这是一个结构 就像DateTime一样。 结构是价值类型。

原因几乎可以肯定,System.Drawing.Point(和PointF)类型用于绘制.NET GDI(+)Wrappers,这需要编组。 编组值类型(即结构)以便Native库可以使用它们比编组堆分配的对象(即类)更快。

从MSDN( .NET Framework中的运行时技术的性能注意事项 ):

需要注意的一个非常重要的事情是ValueTypes在互操作场景中不需要编组。 由于编组是与本机代码互操作时性能最高的一个,因此使用ValueTypes作为本机函数的参数可能是您可以做的最大性能调整。

好吧,我不是特别了解微软的原因,但这是有道理的。 它是一个固定大小的结构,包含少量不可变数据。 我宁愿在堆栈上分配这样的东西,它易于分配并且易于免费。 使它成为一个类并将其放在堆上意味着它必须由GC管理,这为这样一个微不足道的事情创造了大量的开销。

在C#中, struct类型被视为值类型,以允许用户定义的值类型。 这是Drawing.Point的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM