欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中sizeof的用法實(shí)例分析

 更新時(shí)間:2014年09月17日 09:32:33   投稿:shichen2014  
這篇文章主要介紹了C#中sizeof的用法,包括了常見的用法及注釋事項(xiàng),需要的朋友可以參考下

sizeof是C#中非常重要的方法,本文就以實(shí)例形式分析C#中sizeof的用法。分享給大家供大家參考。具體分析如下:

在C#中,sizeof用來計(jì)算類型的大小,單位是字節(jié)。有這樣的一個(gè)類:

public class MyUglyClass
{
  public char myChar1;
  public int myInt;
  public char myChar2;
}

在客戶端,試圖使用sizeof計(jì)算該類型的大小。

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ò)說明要使用sizeof,必須使用關(guān)鍵字unsafe
○ 第二個(gè)報(bào)錯(cuò)說明sizeof對運(yùn)行時(shí)變量無效,只能針對編譯器變量統(tǒng)計(jì)其大小

把類改成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));
    }

  }
}

運(yùn)行,繼續(xù)報(bào)錯(cuò):"不安全代碼只會在使用 /unsafe 編譯的情況下出現(xiàn)"。
解決方法是:右鍵項(xiàng)目→屬性→生成→勾選"允許不安全代碼"→保存

再次運(yùn)行,結(jié)果:12

問題又來了,在MyUglyClass這個(gè)值類型結(jié)構(gòu)中,char類型16位,相當(dāng)于2個(gè)字節(jié),int類型32位,相當(dāng)于4個(gè)字節(jié)。MyUglyClass類型大小=2+2+4=8個(gè)字節(jié),應(yīng)該是8個(gè)字節(jié)才對!怎么會是12個(gè)字節(jié)呢?

這就涉及到棧的對齊和填充了。就拿上面的例子來說:原本,棧上有int類型的變量占4個(gè)字節(jié),2個(gè)char類型的變量分別占2個(gè)字節(jié),當(dāng)棧上的這些變量排列之后,棧還要進(jìn)行對齊排列,即所有較小字節(jié)的變量向最大字節(jié)的變量看齊,并且填充空位。

紅叉部分是為了對齊而填充補(bǔ)上的。

如果想忽略為了對齊而填充補(bǔ)上的部分,可以使用[StructLayout]特性。

[StructLayout(LayoutKind.Auto)]
public struct MyUglyClass
{
  public char myChar1;
  public int myInt;
  public char myChar2;
}

再次運(yùn)行,結(jié)果:8

總結(jié):sizeof只適用于值類型,并且需要在unsafe上下文環(huán)境中使用

相信本文所述對大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的借鑒參考價(jià)值。

相關(guān)文章

最新評論