2012-08-29 72 views
3

我正在構建一個應用程序,我需要處理圖中的位置。這個位置具有X,Y的價值以及像北,東,南和向東的方向。我認爲這個位置可能是Struct,因爲它代表該圖中的單個值。如何知道我的對象在C#中有多少個字節?

我研究和思考Structs並找到這些規則,以便使用Struct

  • 它在邏輯上表示單個值,類似於原始類型 (整數,雙,等)。
  • 它的實例大小小於16個字節。
  • 它是不可變的。
  • 它不會經常被裝箱。

這裏是我未完成的Struct一個例子:

public struct Position 
{ 
    public long PositionX { get; set; } 

    public long PositionY { get; set; } 

    public CompassPoint CompassPoint { get; set; } 
} 

public enum CompassPoint : byte 
{ 
    North, 
    East, 
    South, 
    West 
} 

我想知道如何計算我Struct的字節大小,我怎麼會知道這是否是一成不變的?

謝謝。

更新:

好。據答覆,我的Struct似乎通過了16個字節,因爲只有兩個long有16個字節+ 1個字節的CompassPoint

但是一個額外的問題是:我得到什麼使用Struct 16字節和不可變?並看看DateTimeStruct,它似乎有更多的16個字節?任何問題?

+0

不是每個長8個字節,聽起來你會有超過16個字節在這裏,如果你真的有兩個多頭和其他東西。 – Hogan

+1

它是可變的,因爲你有公共'set'訪問器。不可變意味着創建後不能更改屬性。 – Blorgbeard

+1

'DateTime'結構只有8個字節。 「Kind」和「Ticks」屬性是其中唯一的實際數據,並且它們一起存儲在「long」中。關於16字節推薦:http://stackoverflow.com/questions/2437925/why-is-struct-better-with-being-less-than-16-bytes/2437938#2437938 – Guffa

回答

6

尺寸取決於CompassPoint類型。但是,每個long將使用8個字節,因此您已經超過推薦的最大值16個字節。雖然這不是一個硬性規則,但是如果你是一個班級的話,你的表現可能會更差,這取決於你如何使用它。

結構的確切大小由JIT編譯器確定,但genreally您可以添加成員的大小來預測大小。小數據類型將被填充,所以如果您的CompassPoint只使用一個字節,它仍然需要4或8個字節才能使結構大小達到一個平坦的邊界。

該結構不是不可變的,因爲您可以更改其中的屬性。使制定者專用,並補充說,可以創建一個構造它,使之不可改變:

public struct Position { 

    public long PositionX { get; private set; } 
    public long PositionY { get; private set; } 
    public CompassPoint CompassPoint { get; private set; } 

    public Position(long x, long y, CompassPoint compass) { 
    PositionX = x; 
    PositionY = y; 
    CompassPoint = compass; 
    } 

} 
+0

看到更新。我添加了CompassPoint實現。 –

+0

@AcazSouza:枚舉將使用一個字節,所以結構總共有20個字節的填充。在x64系統上可能有24個字節。 – Guffa

+0

感謝您的回覆,但我對此有更多疑問。你可以幫助我?請參閱更新。另一個問題是爲什麼20? 2長= 16 + 1字節= 17o.O.爲什麼20?非託管字節? –

2

您可以使用Marshal.SizeOf method獲得非託管的大小,以字節爲單位,你的結構組成:

Position pos = new Position(); // this constructor call is not necessary for structs 
int sizeInBytes = Marshal.SizeOf(pos); 

但請注意,對象的非託管和管理大小有時可能會有所不同。

相關問題