2012-08-22 43 views
2

我有其中一個結構可能是優選的一類的情況下:獲取屬性是否會影響結構的大小?

  • 含有3級的bool
  • 是不可改變
  • 從不盒裝

然而,我想添加一個只有獲得訪問權限的屬性數量,它提供了上述3個布爾的組合。例如,bools是「相同」,「前進」和「後退」。屬性應該是「全部」,「無」,「單向」,「雙向」等等,這可以從前者確定3.

這些屬性會增加結構上每個實例的大小堆棧,從而使一個類更合適?或者它會不會影響選擇?

回答

6

簡短回答:

不,他們沒有。

長答案:

不,他們不;但...

屬性本身只是常規方法,但穿着類似字段的語法。由於方法只存在於內存中的一個位置(因爲它們對於該類型的每個對象都是相同的),所以它們不會影響每個實例的大小。請注意,虛擬方法(包括虛擬屬性)會混淆這一點,因爲添加新的虛擬方法會增加vtable的大小,但是每個類只能存在一次vtable;但是這是毫無意義的,因爲結構在.NET中沒有vtable(在C++中他們這樣做,但這是因爲結構和類在語義上是相同的)。

「屬性」可以增加結構類型的內存大小,但前提是編寫它們的人與「自動屬性」不相似。 C#3.0引入了自動實現的屬性(簡稱「auto-properties」),其中隱藏字段由編譯器爲簡單的getter/setter屬性創建。語法是public PropertyName { get; set; }

返回專題:只有實例成員字段會影響結構的大小,除非在使用自定義StructLayout時(這是您在C#中創建union的方式)有重疊的字段。請注意,靜態成員不會影響實例的大小,但在VB中,Static關鍵字用於本地變量時可能會影響實例大小(儘管同一個詞「靜態」,但VB中標記爲Static的局部變量不在類靜態)。

最後,請注意,在.NET中存在與值相關的開銷,但這些開銷在.NET的「託管」本質中固有,但它們不適用於互操作場景中使用的結構(即指針算術和sizeof所有工作都像在C/C++下一樣)。

+1

我認爲應該修改措辭以包含「自動屬性」(以及它們如何創建/導致隱式成員......這不適用於此問題,但會拋光此迴應)。 – 2012-08-22 01:23:43

+0

糾正我,如果我錯了,但編譯器不會生成一個完整的屬性與支持字段的自動屬性,這將增加結構的大小? –

+0

謝謝!我認爲是這樣,但這有助於解決任何疑問。 –

相關問題