程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [C#] 裝箱和拆箱(整理中),

[C#] 裝箱和拆箱(整理中),

編輯:關於.NET

[C#] 裝箱和拆箱(整理中),


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

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

1         static void Main(string[] args)
2         {
3             var i = 123;    //System.Int32
4 
5             //對 i 裝箱(隱式)
6             object obj = i;
7 
8             Console.Read();
9         }

 

  然後,可以將對象 o 拆箱並分配給整型變量 i。

 1         static void Main(string[] args)
 2         {
 3             var i = 123;    //System.Int32
 4 
 5             //對 i 裝箱(隱式)
 6             object obj = i;
 7 
 8             //對 obj 進行拆箱(顯式)
 9             i = (int)obj;
10 
11             Console.Read();
12         }

 

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

 1         static void Main(string[] args)
 2         {
 3             //使用 string.Format 演示裝箱的使用,在這裡 24 會被進行裝箱操作
 4             var formatStr = string.Format("{0} {1}.", "I'm", 24);
 5             Console.WriteLine($"formatStr: {formatStr}");
 6 
 7             var objs = new List<object>();
 8             for (int i = 0; i < 5; i++)
 9             {
10                 //每一次 i 都會裝箱到 objs 中
11                 objs.Add(i);
12             }
13 
14             Console.WriteLine("==========");
15 
16             foreach (var obj in objs)
17             {
18                 //兩個 object 類型不能直接使用 * ,需要使用 int 進行顯式拆箱
19                 Console.WriteLine($"{obj} * {obj} = {(int)obj * (int)obj}");
20             }
21 
22             Console.Read();
23         }

性能

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

 

裝箱 

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

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

    var i = 123;    //System.Int32

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

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

  

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved