C#中sizeof的用法實(shí)例分析
sizeof是C#中非常重要的方法,本文就以實(shí)例形式分析C#中sizeof的用法。分享給大家供大家參考。具體分析如下:
在C#中,sizeof用來(lái)計(jì)算類(lèi)型的大小,單位是字節(jié)。有這樣的一個(gè)類(lèi):
public class MyUglyClass
{
public char myChar1;
public int myInt;
public char myChar2;
}
在客戶(hù)端,試圖使用sizeof計(jì)算該類(lèi)型的大小。
class Program
{
static void Main(string[] args)
{
MyUglyClass m = new MyUglyClass();
m.myChar1 = 'd';
m.myInt = 25;
m.myChar2 = 'a';
Console.WriteLine(sizeof(MyUglyClass));
}
}
運(yùn)行之后報(bào)錯(cuò)如下圖所示:

○ 第一個(gè)報(bào)錯(cuò)說(shuō)明要使用sizeof,必須使用關(guān)鍵字unsafe
○ 第二個(gè)報(bào)錯(cuò)說(shuō)明sizeof對(duì)運(yùn)行時(shí)變量無(wú)效,只能針對(duì)編譯器變量統(tǒng)計(jì)其大小
把類(lèi)改成struct值類(lèi)型。
public struct MyUglyClass
{
public char myChar1;
public int myInt;
public char myChar2;
}
客戶(hù)端改成如下:
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));
}
}
}
運(yùn)行,繼續(xù)報(bào)錯(cuò):"不安全代碼只會(huì)在使用 /unsafe 編譯的情況下出現(xiàn)"。
解決方法是:右鍵項(xiàng)目→屬性→生成→勾選"允許不安全代碼"→保存
再次運(yùn)行,結(jié)果:12
問(wèn)題又來(lái)了,在MyUglyClass這個(gè)值類(lèi)型結(jié)構(gòu)中,char類(lèi)型16位,相當(dāng)于2個(gè)字節(jié),int類(lèi)型32位,相當(dāng)于4個(gè)字節(jié)。MyUglyClass類(lèi)型大小=2+2+4=8個(gè)字節(jié),應(yīng)該是8個(gè)字節(jié)才對(duì)!怎么會(huì)是12個(gè)字節(jié)呢?
這就涉及到棧的對(duì)齊和填充了。就拿上面的例子來(lái)說(shuō):原本,棧上有int類(lèi)型的變量占4個(gè)字節(jié),2個(gè)char類(lèi)型的變量分別占2個(gè)字節(jié),當(dāng)棧上的這些變量排列之后,棧還要進(jìn)行對(duì)齊排列,即所有較小字節(jié)的變量向最大字節(jié)的變量看齊,并且填充空位。

紅叉部分是為了對(duì)齊而填充補(bǔ)上的。
如果想忽略為了對(duì)齊而填充補(bǔ)上的部分,可以使用[StructLayout]特性。
[StructLayout(LayoutKind.Auto)]
public struct MyUglyClass
{
public char myChar1;
public int myInt;
public char myChar2;
}
再次運(yùn)行,結(jié)果:8
總結(jié):sizeof只適用于值類(lèi)型,并且需要在unsafe上下文環(huán)境中使用。
相信本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的借鑒參考價(jià)值。
相關(guān)文章
C#不同類(lèi)型的成員變量(字段)的默認(rèn)值介紹
雖然C#編譯器為每個(gè)類(lèi)型都設(shè)置了默認(rèn)類(lèi)型,但作為面向?qū)ο蟮脑O(shè)計(jì)原則,我們還是需要對(duì)變量進(jìn)行正確的初始化。實(shí)際上這也是C#推薦的做法2014-01-01
C#的FileInfo類(lèi)實(shí)現(xiàn)文件操作實(shí)例
這篇文章主要介紹了C#的FileInfo類(lèi)實(shí)現(xiàn)文件操作實(shí)例,比較實(shí)用的功能,需要的朋友可以參考下2014-07-07
C#實(shí)現(xiàn)DataGridView控件行列互換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)DataGridView控件行列互換的方法,涉及C#中DataGridView控件元素遍歷與添加操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
淺析C#靜態(tài)類(lèi),靜態(tài)構(gòu)造函數(shù),靜態(tài)變量
這篇文章主要介紹了淺析C#靜態(tài)類(lèi),靜態(tài)構(gòu)造函數(shù),靜態(tài)變量 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

