您好,登錄后才能下訂單哦!
這篇文章主要講解了“C#裝箱和拆箱是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C#裝箱和拆箱是什么”吧!
裝箱:將值類型轉換為引用類型。
拆箱:將引用類型轉換為值類型。
值類型是一種相對輕型的類型,不像對象那樣在托管堆中分配,也不會被GC,不通過指針來引用,不過在有些時候需要獲取對值類型的引用,例如在使用net1.0的集合類ArrayList的時候。
class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); Point p;//因Point為值類型,分配在堆棧中 for (int i = 0; i < 100; i++) { pp.x = p.y = i; //初始化Point中的成員 list.Add(p);//對p進行裝箱后,將引用添加到list中 } } } struct Point { public Int32 x; public Int32 y; }ArrayList的Add方法是接受一個Object參數,如下 public virtual int Add(object value);
所以在執行Add方法時會將Point值類型轉換為一個堆得托管對象,并獲取到這個對象的引用,將引用地址存儲在ArrayList中。
在一個值類型裝箱的時候內部發生的事情:
l 在托管堆分配好內存。分配的內存是值類型的各個字段所需內存量加上托管堆上的兩個額外成員(類型對象指針和同步索引塊)所需的內存量。
l 值類型中的字段值復制到新分配的堆內存中。
l 返回對象的引用地址。
拆箱就是執行和裝箱相反的操作,將引用類型轉化為值類型。接上面的代碼,獲取ArrayList中的元素值用如下代碼:
for (int j = 0; j < 10; j++) { Point point =(Point)list[j]; Console.WriteLine("X:" + point.x + " Y:" + point.y); }
上面的代碼中通過索引取到ArrayList中存儲的各個Point的引用地址,通過Point類型轉換將其對應的值從堆中復制到Point的實例point中,這個轉換的過程就是拆箱的過程。
在拆箱的過程中要注意以下兩點:
1. 如果對已裝箱的值類型的引用的變量為null,會引發NullRefreenceException異常
2. 如果一個引用指向的對象在拆箱時不是用的裝箱時所使用的類型,將會引發InvalidCastException異常。代碼如下:
static void Main(string[] args) { Int32 x = 5; Object o = x; Int16 y = (Int16)o;//引發InvalidCastException異常 }
正確的做法是,現將其用Int32類型來拆箱,然后再強制轉換為Int16
static void Main(string[] args) { Int32 x = 5; Object o = x; Int16 y = (Int16)(Int32)o; }
下面來看兩段程序來深入理解下裝箱和拆箱
代碼一:
static void Main(string[] args) { Int32 x = 5; Object o = x; x = 123; Console.WriteLine(x + ", " + (Int32)o); }
感謝各位的閱讀,以上就是“C#裝箱和拆箱是什么”的內容了,經過本文的學習后,相信大家對C#裝箱和拆箱是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。