代码之家  ›  专栏  ›  技术社区  ›  Bastien Vandamme

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

  •  3
  • Bastien Vandamme  · 技术社区  · 15 年前

    我读到system.drawing.point是一个值类型。我不明白。为什么?

    5 回复  |  直到 13 年前
        1
  •  9
  •   Julien Roncaglia    15 年前

    微软试图遵循一些规则,它们在msdn中很好地解释了这些规则,请参见 Choosing Between Classes and Structures ( The book 更好,因为它有很多有趣的评论)

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

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

    正如我所说,我猜他们不尊重“不变的”部分的事实,是因为在编写系统时没有规则。绘图和图形操作的速度可能对这一点非常敏感。

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

        2
  •  2
  •   Pablo Santa Cruz    15 年前

    这是一个 Structure . 就像日期时间。结构是价值类型。

        3
  •  2
  •   VisualMelon    13 年前

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

    从MSDN( Performance Considerations for Run-Time Technologies in the .NET Framework ):

    需要注意的一件非常重要的事情是,值类型不需要在互操作方案中进行封送处理。由于在与本机代码进行交互操作时,封送是最大的性能影响之一,因此使用valuetypes作为本机函数的参数可能是您能做的最大的性能调整。

        4
  •  0
  •   jrista    15 年前

    嗯,我不知道微软的具体原因,但这是有道理的。它是一个固定大小的结构,包含少量不变的数据。我宁愿在堆栈上分配这样一个东西,在那里它易于分配和释放。把它变成一个类并放到堆中意味着它必须由GC管理,这会为这样一个微不足道的事情产生大量的开销。

        5
  •  0
  •   RedGlyph sumit sonawane    15 年前

    在C, struct 类型被视为值类型,以允许用户定义的值类型。这就是drawing.point的例子。