標籤:
這篇文章主要介紹了C#中sizeof的用法,包括了常見的用法及注釋事項,需要的朋友可以參考下。
sizeof是C#中非常重要的方法,本文就以執行個體形式分析C#中sizeof的用法。分享給大家供大家參考。具體分析如下:
在C#中,sizeof用來計算類型的大小,單位是位元組。有這樣的一個類:
123456 |
public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
在用戶端,試圖使用sizeof計算該類型的大小。
1234567891011 |
class Program { static void Main( string [] args) { MyUglyClass m = new MyUglyClass(); m.myChar1 = ‘d‘ ; m.myInt = 25; m.myChar2 = ‘a‘ ; Console.WriteLine( sizeof (MyUglyClass)); } } |
運行之後報錯如所示:
○ 第一個報錯說明要使用sizeof,必須使用關鍵字unsafe
○ 第二個報錯說明sizeof對運行時變數無效,只能針對編譯器變數統計其大小
把類改成struct實值型別。
123456 |
public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
用戶端改成如下:
123456789101112131415 |
class Program { static void Main( string [] args) { MyUglyClass m = new MyUglyClass(); m.myChar1 = ‘d‘ ; m.myInt = 25; m.myChar2 = ‘a‘ ; unsafe { Console.WriteLine( sizeof (MyUglyClass)); } } } |
運行,繼續報錯:"不安全的程式碼只會在使用 /unsafe 編譯的情況下出現"。
解決方案是:右鍵項目→屬性→產生→勾選"允許不安全的程式碼"→儲存
再次運行,結果:12
問題又來了,在MyUglyClass這個實值型別結構中,char類型16位,相當於2個位元組,int類型32位,相當於4個位元組。MyUglyClass類型大小=2+2+4=8個位元組,應該是8個位元組才對!怎麼會是12個位元組呢?
這就涉及到棧的對齊和填充了。就拿上面的例子來說:原本,棧上有int類型的變數佔4個位元組,2個char類型的變數分別佔2個位元組,當棧上的這些變數排列之後,棧還要進行對齊排列,即所有較小位元組的變數向最大位元組的變數看齊,並且填充空位。
紅叉部分是為了對齊而填充補上的。
如果想忽略為了對齊而填充補上的部分,可以使用[StructLayout]特性。
1234567 |
[StructLayout(LayoutKind.Auto)] public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
再次運行,結果:8
總結:sizeof只適用於實值型別,並且需要在unsafe上下文環境中使用。
相信本文所述對大家C#程式設計的學習有一定的借鑒參考價值。
C#中sizeof的用法執行個體分析