2009-11-02 51 views
2

我讀到System.Drawing.Point是一個值類型。我不明白。爲什麼?System.Drawing.Point是一個值類型。爲什麼?

+0

這是一組的一對值類型項。爲什麼你需要它是非價值型的? – 2009-11-02 00:30:34

+0

我不需要它是非價值型的。我只是想明白。現在我明白了。 – 2009-11-02 00:40:28

+1

這不是昨天你問的那個問題嗎? http://stackoverflow.com/questions/1654325/why-is-datetime-a-structure-in-net – 2009-11-02 00:40:46

回答

9

有跡象表明,微軟試圖遵循這個規則,他們解釋他們很好的MSDN,看到Choosing Between Classes and StructuresThe book是,儘管它有很多有趣的評論更好)

即使點是不是一個這個好樣本:

  • 結構理應代表一個值(在這種情況下的位置,即使它有2個組件,但是複數也可以在兩個部分分開,它們是爲總理候選人結構)
  • 結構應該hav e小於16個字節的實例大小。 (OK,2x4 = 8)
  • 結構不應該經常被裝箱。 (好吧這個人是右)
  • 結構應該是一成不變的(這裏是他們不遵守自己的規則的一部分,但我想這微優化吃胖的規則,反正後來寫)

正如我說,我想這樣一個事實,他們沒有尊重「不可改變的」部分既是因爲沒有當System.Drawing中寫入規則和速度的圖形操作可能會非常敏感對此。

,如果他們是正確的還是不這樣做,我不知道,也許他們測量了一些常用的算法,發現他們在分配臨時對象和複製他們在失去了太多的性能。無論如何,這種優化只能在仔細衡量實際使用的類/結構之後才能完成。

+1

關於Point是可變的:與作爲舊的WIN32 POINT結構的讓步不同。 – 2009-11-02 05:45:07

+0

是的,多虧了點它,我把它放在我的答案的第一個版本,但刪除它,因爲我不知道它是否真的是一個原因(無論如何,即使有一個不可變的結構,它也將工作,它只是使移植舊Win32代碼更困難)。要知道究竟是什麼原因的唯一方法是讓微軟的某人提供歷史信息。 – 2009-11-02 12:39:38

2

這是一個Structure。就像DateTime一樣。結構是價值類型。

0

好了,我不知道具體原因,微軟,但它是有道理的。它是一個包含少量不可變數據的固定大小的結構。我寧願在堆棧中分配這樣的東西,它很容易分配並且易於釋放。把它作爲一個類並把它放在堆上意味着它必須由GC來管理,這爲這樣一個小事情創造了大量的開銷。

0

在C#,struct類型被認爲是值類型,以允許用戶定義值類型。 Drawing.Point就是這種情況。

2

這樣做的原因是幾乎可以肯定的是,System.Drawing.Point(和的PointF)類型用於通過.NET GDI(+)包裝器,這需要編組繪製。編組值的類型(即結構)以便本地庫可以使用它們比編組堆對象(即類)更快。

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

的一個極其重要的一點要注意的是,值類型需要互操作場景沒有編組。由於編組是與本機代碼互操作時最大的性能命中之一,因此使用ValueTypes作爲本機函數的參數可能是您可以執行的最大性能調整。

相關問題