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

首頁 > 編程 > C# > 正文

再談對C#的值類型的理解

2023-05-05 19:01:40
字體:
來源:轉載
供稿:網友

我們知道在C#中 所有的類型繼承于System.Object根類型,這也就意味著就代碼層面來講,在C#中所有的類型都是Class,即一切都是Class類型,既然全部都是Class類型,那么值類型在哪里呢?我們可以發現在C#中 System.Int16,System.Int32,System.Boolean...等等這些常用的類型都是Struct 結構類型,那么結構類型是什么,下面我們定義一個結構,然后通過IL Disassemble 工具來查看編譯的中間代碼便可以得到結果.

public struct CustomerStruct
    {
  public string Name{get;set;}
  }

代碼非常簡單,我們就定義一個struct類型,并且包含一個Name屬性.

再談對C#值類型的理解

看到上面這幅圖,看到定義一個struct類型實際上編譯把你所定義的類型繼承了System.ValueType類型,換句話說,在C#中我們經常使用的System.Int16,System.Int32,System.Boolean..這些數值結構類型都是繼承于 System.ValueType類型,而System.ValueType又是繼承于System.Object根類型,即驗證我開始所講到的在C#中 一切類型都是Class。

之所以存在"值類型" 這個概念,其實是因為C#中的某些類型有這特殊的地位(即繼承于System.ValueType的類型),CLR會特殊的對待這些類型,看下面這2行代碼

Int32 a = new System.Int32(10) ;
  CustomerStruct customer = new CustomerStruct() ;

首先為什么對于數值類型也可以使用 new 來進行內存分配呢? 上面已經講到,因為他們都是Class類型,當然可以使用new 來進行內存分配.

其次,CLR執行這樣的代碼的時,CLR 通過反射(有待考察)或者其他途徑來獲知所要請求分配內存的類型是否繼承于System.ValueType如果是的話,那么就在棧上進行分配,如果不是 的話,那么就是我們所說的引用類型,就在托管堆上分配內存以及棧上分配對應的引用變量,這些一切都是CLR做的工作.

我們再來看看裝箱操作.

object o = new object();
  Int32 aaa = 100;
  o = aaa; //這里會發生裝箱操作

我們都知道當CLR執行到 o = aaa;這條語句時會發生裝箱操作,為什么會發生裝箱操作呢?這是因為CLR 知道引用變量o所要引用的類型aaa是繼承于System.ValueType類型的,繼承于System.ValueType的類型都是在棧上分配的, 而其它則是在托管堆上分配的,所以會CLR會弄得aaa的副本弄到托管堆上去,這一切也都是CLR的工作.

由此我們可以得出結論:

(1)在C#中 就代碼層面上講 所有的類型都是Class類型.

(2)所謂的 "值類型" != 數值類型,而是所有繼承于System.ValueType 的類型.

(3)"值類型" 得到的語言級別的支持,CLR知道如何對 "值類型" 這樣的Class類型進行內存分配和處理.

以上是作者對C#中值類型的一個理解,希望與大家探討。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠安县| 柳河县| 合水县| 潼南县| 宁陵县| 英德市| 类乌齐县| 哈密市| 连山| 巴南区| 定襄县| 西华县| 万山特区| 石柱| 闻喜县| 旌德县| 资溪县| 淮南市| 富锦市| 兴隆县| 勃利县| 合山市| 建德市| 台中县| 呼伦贝尔市| 阳高县| 密云县| 怀来县| 思南县| 永州市| 建德市| 多伦县| 锡林浩特市| 镇赉县| 平顺县| 仲巴县| 清水河县| 拜城县| 乌海市| 深水埗区| 新宁县|