我讀到System.Drawing.Point是一個值類型。我不明白。爲什麼?System.Drawing.Point是一個值類型。爲什麼?
回答
有跡象表明,微軟試圖遵循這個規則,他們解釋他們很好的MSDN,看到Choosing Between Classes and Structures(The book是,儘管它有很多有趣的評論更好)
即使點是不是一個這個好樣本:
- 結構理應代表一個值(在這種情況下的位置,即使它有2個組件,但是複數也可以在兩個部分分開,它們是爲總理候選人結構)
- 結構應該hav e小於16個字節的實例大小。 (OK,2x4 = 8)
- 結構不應該經常被裝箱。 (好吧這個人是右)
- 但結構應該是一成不變的(這裏是他們不遵守自己的規則的一部分,但我想這微優化吃胖的規則,反正後來寫)
正如我說,我想這樣一個事實,他們沒有尊重「不可改變的」部分既是因爲沒有當System.Drawing中寫入規則和速度的圖形操作可能會非常敏感對此。
,如果他們是正確的還是不這樣做,我不知道,也許他們測量了一些常用的算法,發現他們在分配臨時對象和複製他們在失去了太多的性能。無論如何,這種優化只能在仔細衡量實際使用的類/結構之後才能完成。
關於Point是可變的:與作爲舊的WIN32 POINT結構的讓步不同。 – 2009-11-02 05:45:07
是的,多虧了點它,我把它放在我的答案的第一個版本,但刪除它,因爲我不知道它是否真的是一個原因(無論如何,即使有一個不可變的結構,它也將工作,它只是使移植舊Win32代碼更困難)。要知道究竟是什麼原因的唯一方法是讓微軟的某人提供歷史信息。 – 2009-11-02 12:39:38
這是一個Structure。就像DateTime一樣。結構是價值類型。
好了,我不知道具體原因,微軟,但它是有道理的。它是一個包含少量不可變數據的固定大小的結構。我寧願在堆棧中分配這樣的東西,它很容易分配並且易於釋放。把它作爲一個類並把它放在堆上意味着它必須由GC來管理,這爲這樣一個小事情創造了大量的開銷。
在C#,struct
類型被認爲是值類型,以允許用戶定義值類型。 Drawing.Point就是這種情況。
這樣做的原因是幾乎可以肯定的是,System.Drawing.Point(和的PointF)類型用於通過.NET GDI(+)包裝器,這需要編組繪製。編組值的類型(即結構)以便本地庫可以使用它們比編組堆對象(即類)更快。
從MSDN(Performance Considerations for Run-Time Technologies in the .NET Framework ):
的一個極其重要的一點要注意的是,值類型需要互操作場景沒有編組。由於編組是與本機代碼互操作時最大的性能命中之一,因此使用ValueTypes作爲本機函數的參數可能是您可以執行的最大性能調整。
- 1. 爲什麼System.Enum不是一個值類型?
- 2. 爲System.Drawing.Point
- 3. 爲什麼不能有一個類型參數是什麼?
- 4. 爲什麼元類有一個類型?
- 5. 爲什麼MonadTrans不是整個類型?
- 6. 爲什麼我不得不爲None返回一個類型值?
- 7. 什麼是一種「類型」?
- 8. 爲什麼NotImplementedType不是一個類型子類?
- 9. 爲什麼我可以檢查DateTime爲null,即使它是一個值類型?
- 10. 爲什麼這隻允許一個類型不是兩個? php
- 11. 爲什麼這個賦值不是類型不匹配?
- 12. 爲什麼值類型不能爲空
- 13. (類型)值和類型(值)之間的區別是什麼?
- 14. 爲什麼String是一個類?
- 15. 字符串是一個類爲什麼
- 16. 爲什麼ClassLoader是一個抽象類?
- 17. 爲什麼java.io.Serializable不是一個類?
- 18. 爲什麼`sData`是一個非零值?
- 19. 爲什麼它總是一個空值?
- 20. 爲什麼std :: numeric_limits :: digits10對於int類型是少一個?
- 21. 爲什麼std :: regex不是一個有效的類型?
- 22. main()中的'i'類型。爲什麼它是一個int&?
- 23. 爲什麼python statistics.mean()返回一個int類型,而不是float
- 24. 爲什麼這不是一個類型不匹配?
- 25. OpenFileDialog.Filter的類型是一個字符串?爲什麼?
- 26. 爲什麼`str`是一個原始類型?
- 27. 這是爲什麼可空類型拋出一個異常
- 28. 什麼是?類型?
- 29. 什麼是價值1.0e + 1的類型
- 30. 該類型的價值是什麼?
這是一組的一對值類型項。爲什麼你需要它是非價值型的? – 2009-11-02 00:30:34
我不需要它是非價值型的。我只是想明白。現在我明白了。 – 2009-11-02 00:40:28
這不是昨天你問的那個問題嗎? http://stackoverflow.com/questions/1654325/why-is-datetime-a-structure-in-net – 2009-11-02 00:40:46