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

C# System.Drawing.Point是一种值类型。为什么?,c#,.net,types,C#,.net,Types,我读到System.Drawing.Point是一种值类型。我不明白。为什么? 这是一个好主意。就像约会时间一样。结构是值类型。嗯,我不知道微软的具体原因,但这是有道理的。它是一个固定大小的结构,包含少量不可变数据。我宁愿在堆栈上分配这样一个东西,在堆栈上分配和释放都很容易。使它成为一个类并将其放在堆上意味着它必须由GC管理,这会为这样一件小事带来大量开销。在C#中,struct类型被视为值类型,以允许用户定义值类型。Drawing.Point就是这样。微软试图遵循一些规则,他们在MSDN中对这

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

这是一个好主意。就像约会时间一样。结构是值类型。

嗯,我不知道微软的具体原因,但这是有道理的。它是一个固定大小的结构,包含少量不可变数据。我宁愿在堆栈上分配这样一个东西,在堆栈上分配和释放都很容易。使它成为一个类并将其放在堆上意味着它必须由GC管理,这会为这样一件小事带来大量开销。

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

微软试图遵循一些规则,他们在MSDN中对这些规则进行了很好的解释,请参见(甚至更好,因为它有很多有趣的评论)

即使Point不是一个很好的例子:

  • Struct在逻辑上应该表示一个值(在这种情况下,一个位置,即使它有两个组件,但复数也可以分为两部分,它们是Struct的主要候选者)
  • 结构的实例大小应小于16字节。(好的,2x4=8)
  • 结构不应该经常装箱。(好的,这个是对的)
  • 但是,Struct应该是不可变的(这里是他们不遵循自己的规则的部分,但我猜微优化超过了规则,这些规则都是后来编写的)
正如我所说的,我想他们没有尊重“不可变”部分的事实是因为在编写系统时没有规则。绘图和图形操作的速度可能对此非常敏感


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

这样做的原因几乎可以肯定是System.Drawing.Point(和PointF)类型用于通过.NET GDI(+)包装进行绘制,这需要编组。编组值类型(即结构)以便本机库可以使用它们比编组堆分配的对象(即类)更快

从MSDN()中:

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


它是一组成对值类型的项目。为什么你需要它是非值类型?我不需要它是非值类型。我只是想了解。现在我知道了。这不是你昨天问的问题吗?既然我知道点也是一个结构,是的。@Dran Dane:你会想知道
为什么不把它作为一个类而不是结构?
我会问:PAbout点是可变的:与其说是优化,不如说是对旧的WIN32点结构的让步。是的,多亏了点,我把它放在我的答案的第一个版本中,但删除了它,因为我不知道这是否真的是一个原因(无论如何,即使有一个不可变的结构,它也会工作,这只会使移植旧的Win32代码更加困难)。要知道这到底是什么原因,唯一的办法就是让微软的人提供历史信息。