国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中sizeof的用法實例分析

2020-01-24 02:24:49
字體:
來源:轉載
供稿:網友

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

在C#中,sizeof用來計算類型的大小,單位是字節。有這樣的一個類:

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對運行時變量無效,只能針對編譯器變量統計其大小

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

運行,繼續報錯:"不安全代碼只會在使用 /unsafe 編譯的情況下出現"。
解決方法是:右鍵項目→屬性→生成→勾選"允許不安全代碼"→保存

再次運行,結果:12

問題又來了,在MyUglyClass這個值類型結構中,char類型16位,相當于2個字節,int類型32位,相當于4個字節。MyUglyClass類型大小=2+2+4=8個字節,應該是8個字節才對!怎么會是12個字節呢?

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

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

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

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

再次運行,結果:8

總結:sizeof只適用于值類型,并且需要在unsafe上下文環境中使用

相信本文所述對大家C#程序設計的學習有一定的借鑒參考價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖江市| 德江县| 东乌| 成武县| 东城区| 新和县| 祥云县| 波密县| 横山县| 莱阳市| 交城县| 成武县| 灵宝市| 凤冈县| 周宁县| 金阳县| 龙里县| 抚顺市| 元谋县| 崇阳县| 大同市| 岑巩县| 敖汉旗| 永新县| 惠水县| 浪卡子县| 吴堡县| 阿克| 贵南县| 新绛县| 洮南市| 农安县| 论坛| 宜兰市| 鹤峰县| 谢通门县| 顺平县| 石台县| 奉化市| 泊头市| 吉木萨尔县|