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

首頁 > 編程 > C# > 正文

C# 裝箱和拆箱的知識回顧

2019-10-29 21:16:59
字體:
來源:轉載
供稿:網友

裝箱是將值類型轉換為 object 類型或由此值類型實現的任何接口類型的一個過程。 當 CLR 對值類型進行裝箱時,會將該值包裝到 System.Object 內部,再將后者存儲在托管堆上。 拆箱將從對象中提取值類型。 裝箱是隱式的;拆箱是顯式的。 裝箱和拆箱的概念是類型系統 C# 統一視圖的基礎,其中任一類型的值都被視為一個對象。

在下面的示例中,將整型變量 i 進行了裝箱并分配給對象 obj。

static void Main(string[] args)  {   var i = 123; //System.Int32   //對 i 裝箱(隱式)   object obj = i;   Console.Read();  }

然后,可以將對象 obj 拆箱并分配給整型變量 i。

static void Main(string[] args)  {   var i = 123; //System.Int32   //對 i 裝箱(隱式)   object obj = i;   //對 obj 進行拆箱(顯式)   i = (int)obj;   Console.Read();  }

這里用代碼進行演示裝箱拆箱操作:

static void Main(string[] args)  {   //使用 string.Format 演示裝箱的使用,在這里 24 會被進行裝箱操作   var formatStr = string.Format("{0} {1}.", "I'm", 24);   Console.WriteLine($"formatStr: {formatStr}");   var objs = new List<object>();   for (int i = 0; i < 5; i++)   {    //每一次 i 都會裝箱到 objs 中    objs.Add(i);   }   Console.WriteLine("==========");   foreach (var obj in objs)   {    //兩個 object 類型不能直接使用 * ,需要使用 int 進行顯式拆箱    Console.WriteLine($"{obj} * {obj} = {(int)obj * (int)obj}");   }   Console.Read();  }

C#,裝箱,拆箱

性能

相對于簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。對值類型進行裝箱時,必須分配并構造一個新對象。拆箱所需的強制轉換也需要進行大量的計算,只是程度較輕。如果你的操作正處于循環的中心,你會很明顯的感覺到性能問題。

裝箱 

裝箱用于在堆中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換。對值類型裝箱會在堆中分配一個對象實例,并將該值復制到新的對象中。

請看以下值類型變量的聲明:

var i = 123;    //System.Int32

以下語句對變量 i 隱式應用了裝箱操作:

 //對 i 裝箱(隱式)進對象 obj object obj = i;

此語句的結果是在堆棧上創建對象引用 o,而在堆上則引用 int 類型的值。 該值是賦給變量 i 的值類型值的一個副本。 下圖說明了兩個變量 i 和 o之間的差異。

C#,裝箱,拆箱

當然,你也可以選擇執行顯式裝箱,但顯式裝箱從來不是必需的。

拆箱

拆箱是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。 拆箱的操作包括:

檢查對象實例,以確保它是給定值類型的裝箱值。

將該值從實例復制到值類型變量中。

   int i = 123;  // 值類型   object o = i;  // 裝箱   int j = (int)o; // 拆箱

C#,裝箱,拆箱

要在運行時成功拆箱值類型,被拆箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的實例創建的。 嘗試取消裝箱 null 會導致 NullReferenceException。 嘗試取消裝箱對不兼容值類型的引用會導致 InvalidCastException。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 徐闻县| 马龙县| 沈阳市| 瑞金市| 鲁甸县| 阿瓦提县| 清水河县| 微山县| 留坝县| 平和县| 彭水| 汝南县| 葵青区| 北海市| 乌鲁木齐市| 来宾市| 丹巴县| 丹凤县| 嘉义县| 吉林省| 宜丰县| 嘉禾县| 丰城市| 台南县| 新余市| 滦南县| 云林县| 武山县| 仁化县| 宝清县| 安化县| 大渡口区| 富锦市| 右玉县| 乐东| 当雄县| 普兰店市| 隆尧县| 钟山县| 杭锦旗| 云梦县|