C#中sizeof的用法實例分析
sizeof是C#中非常重要的方法,本文就以實例形式分析C#中sizeof的用法。分享給大家供大家參考。具體分析如下:
在C#中,sizeof用來計算類型的大小,單位是字節(jié)。有這樣的一個類:
public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; }
在客戶端,試圖使用sizeof計算該類型的大小。
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對運行時變量無效,只能針對編譯器變量統(tǒng)計其大小
把類改成struct值類型。
public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; }
客戶端改成如下:
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)); } } }
運行,繼續(xù)報錯:"不安全代碼只會在使用 /unsafe 編譯的情況下出現(xiàn)"。
解決方法是:右鍵項目→屬性→生成→勾選"允許不安全代碼"→保存
再次運行,結果:12
問題又來了,在MyUglyClass這個值類型結構中,char類型16位,相當于2個字節(jié),int類型32位,相當于4個字節(jié)。MyUglyClass類型大小=2+2+4=8個字節(jié),應該是8個字節(jié)才對!怎么會是12個字節(jié)呢?
這就涉及到棧的對齊和填充了。就拿上面的例子來說:原本,棧上有int類型的變量占4個字節(jié),2個char類型的變量分別占2個字節(jié),當棧上的這些變量排列之后,棧還要進行對齊排列,即所有較小字節(jié)的變量向最大字節(jié)的變量看齊,并且填充空位。
紅叉部分是為了對齊而填充補上的。
如果想忽略為了對齊而填充補上的部分,可以使用[StructLayout]特性。
[StructLayout(LayoutKind.Auto)] public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; }
再次運行,結果:8
總結:sizeof只適用于值類型,并且需要在unsafe上下文環(huán)境中使用。
相信本文所述對大家C#程序設計的學習有一定的借鑒參考價值。
相關文章
C#實現(xiàn)DataGridView控件行列互換的方法
這篇文章主要介紹了C#實現(xiàn)DataGridView控件行列互換的方法,涉及C#中DataGridView控件元素遍歷與添加操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08淺析C#靜態(tài)類,靜態(tài)構造函數(shù),靜態(tài)變量
這篇文章主要介紹了淺析C#靜態(tài)類,靜態(tài)構造函數(shù),靜態(tài)變量 的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06