[英]CollectionEditor yielding “Object does not match target type.” for System.Drawing.Point
[英]System.Drawing.Point is a value type. Why?
我读到System.Drawing.Point是一个值类型。 我不明白。 为什么?
微软试图遵循这些规则,他们在MSDN中很好地解释它们,参见在类和结构之间选择 ( 这本书更好,因为它有很多有趣的评论)
即使Point不是这样的好例子:
正如我所说,我猜他们没有尊重“不可变”部分的事实是因为在编写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.