.Net装箱拆箱编程实例
.Net裝箱拆箱編程實例
裝箱是將值類型轉換為引用類型 ;拆箱是將引用類型轉換為值類型。
利用裝箱和拆箱功能,可通過允許值類型的任何值與Object 類型的值相互轉換,將值類型與引用類型鏈接起來。
由于C#中所有的數據類型都是由基類System.Object繼承而來的,所以值類型和引用類型的值可以通過顯式(或隱式)操作相互轉換,而這轉換過程也就是裝箱(boxing)和拆箱(unboxing)過程。
二
裝箱是將值類型轉換為 object 類型或由此值類型實現的任何接口類型的過程。當 CLR 對值類型進行裝箱時,會將該值包裝到 System.Object 內部,再將后者存儲在托管堆上。取消裝箱將從對象中提取值類型。裝箱是隱式的;取消裝箱是顯式的。裝箱和取消裝箱的概念是類型系統 C# 統一視圖的基礎,其中任一類型的值都被視為一個對象。
相對于簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。對值類型進行裝箱時,必須分配并構造一個新對象。取消裝箱所需的強制轉換也需要進行大量的計算,只是程度較輕。
裝箱用于在垃圾回收堆中存儲值類型。裝箱是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換。對值類型裝箱會在堆中分配一個對象實例,并將該值復制到新的對象中。
取消裝箱是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。取消裝箱操作包括:
? ? 檢查對象實例,以確保它是給定值類型的裝箱值。
? ? 將該值從實例復制到值類型變量中。
三 編程實例
1 演示正常的裝箱拆箱
using System;
// boxing.cs
// Boxing an integer variable
class TestBoxing ?
{
? ?public static void Main()?
? ?{
? ? ? int i = 123;
? ? ? object o = i; ?// Implicit boxing
? ? ? i = 456; ? ? ? // Change the contents of i
? ? ? Console.WriteLine("The value-type value = {0}", i);
? ? ? Console.WriteLine("The object-type value = {0}", o);
? ? ??
? ? ? //裝箱和取消裝箱操作:
int i2 = 123; ? ? ? ? ?// A value type
object box = i2; ? ? ? // Boxing
int j2 = (int)box; ? ? // Unboxing
Console.WriteLine(box);
Console.WriteLine(j2);
? ? ??
? ? ? Console.Write("按任意鍵繼續 . . . ");
Console.ReadKey(true);
? ?}
}
運行截圖;
2 正常的裝箱拆箱和拆箱發生異常時捕獲到異常
using System;
public class UnboxingTest?
{
? ?public static void Main()?
? ?{
? ? ? int intI = 123;
? ? ? // Boxing
? ? ? object o = intI;
? ? ? // Reference to incompatible object produces InvalidCastException
? ? ? try?
? ? ? {
? ? ? ? ?int intJ = (short) o;
? ? ? ? ?//int intJ = (int) o;
? ? ? ? ?Console.WriteLine("Unboxing OK.");
? ? ? ? ?Console.Write("按任意鍵繼續 . . . ");
Console.ReadKey(true);
? ? ? }
? ? ? catch (InvalidCastException e)?
? ? ? {
? ? ? ? ?Console.WriteLine("{0} Error: Incorrect unboxing.",e);
? ? ? ? ?Console.Write("按任意鍵繼續 . . . ");
Console.ReadKey(true);
? ? ? }
? ?}
}
? ? 上述程序分別把上面一句 int intJ定義語句和下面一句int intJ定義語句注釋掉的運行截圖分別如下;
工程源碼:
http://pan.baidu.com/s/1dDs7jdn
總結
以上是生活随笔為你收集整理的.Net装箱拆箱编程实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用C#进行ArcGIS 10 Engin
- 下一篇: 图文详解asp.net自带控件