2009-12-01 56 views
0

在一個blog entry, Luca Bolognese幾點思考這種想法約結構與類作爲成員字段:C#:結構成員是否更高性能?

使用一個結構的理由是爲了不 的 棧上分配一個附加的目的。這允許這種解決方案作爲'高性能'爲 ,因爲簡單地在類本身上編碼了 字段。或至少在 至少我認爲是這樣的...

這有多準確?

首先,他不是指在上分配額外的對象嗎?

而且,不會增加內存佔用的代價,不會使用結構稍微減少分配時間(特別是如果類成員是延遲加載的話)?

你會推薦這種結構在某些情況下類的結構嗎?

回答

4

我想他的確寫了堆,他只是寫錯了。

結構或類的問題經常出現。這裏有一個example。我認爲這是最好遵循這一普遍給出的建議是:


MSDN有了答案:Choosing Between Classes and Structures

基本上,該頁面爲您提供了一個4項清單,並說除非您的類型符合所有標準,否則使用一個類。

不要定義一個結構,除非類型有以下所有特點:

* It logically represents a single value, similar to primitive types (integer, double, and so on). 
* It has an instance size smaller than 16 bytes. 
* It is immutable. 
* It will not have to be boxed frequently. 

是不是有時候你不應該遵循這一建議?也許,但只有在你通過分析證明它之後。

+0

感謝馬克 - 所以,擴展在該列表中的最後一項:如果我需要經常使用/傳遞一個類的字段(從而拆箱)字段不應該是一個結構,是嗎? – 2009-12-01 21:13:18

+0

@JeffMeatballYang:只有當它們被複制到引用類型(例如'Object','ValueType'或任何接口類型)的存儲位置(變量,參數,字段等)時,纔會對值類型進行裝箱。如果在「列表」中存儲「矩形」,則不會有拳擊。但是,如果將一個'Rectangle'存儲在'List'中,則會出現裝箱,因爲後者需要將每個'Rectangle'存儲在類型爲Object的位置。雖然有一些情況下拳擊將是不可避免的,一般來說,如果你拳擊價值類型,你做錯了什麼。 – supercat 2012-02-26 19:10:41