C# 裝箱和拆箱的知識回顧
裝箱是將值類型轉(zhuǎn)換為 object 類型或由此值類型實現(xiàn)的任何接口類型的一個過程。 當 CLR 對值類型進行裝箱時,會將該值包裝到 System.Object 內(nèi)部,再將后者存儲在托管堆上。 拆箱將從對象中提取值類型。 裝箱是隱式的;拆箱是顯式的。 裝箱和拆箱的概念是類型系統(tǒng) C# 統(tǒng)一視圖的基礎(chǔ),其中任一類型的值都被視為一個對象。
在下面的示例中,將整型變量 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(); }
性能
相對于簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。對值類型進行裝箱時,必須分配并構(gòu)造一個新對象。拆箱所需的強制轉(zhuǎn)換也需要進行大量的計算,只是程度較輕。如果你的操作正處于循環(huán)的中心,你會很明顯的感覺到性能問題。
裝箱
裝箱用于在堆中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實現(xiàn)的任何接口類型的隱式轉(zhuǎn)換。對值類型裝箱會在堆中分配一個對象實例,并將該值復制到新的對象中。
請看以下值類型變量的聲明:
var i = 123; //System.Int32
以下語句對變量 i 隱式應(yīng)用了裝箱操作:
//對 i 裝箱(隱式)進對象 obj object obj = i;
此語句的結(jié)果是在堆棧上創(chuàng)建對象引用 o,而在堆上則引用 int 類型的值。 該值是賦給變量 i 的值類型值的一個副本。 下圖說明了兩個變量 i 和 o之間的差異。
當然,你也可以選擇執(zhí)行顯式裝箱,但顯式裝箱從來不是必需的。
拆箱
拆箱是從 object 類型到值類型或從接口類型到實現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。 拆箱的操作包括:
檢查對象實例,以確保它是給定值類型的裝箱值。
將該值從實例復制到值類型變量中。
int i = 123; // 值類型 object o = i; // 裝箱 int j = (int)o; // 拆箱
要在運行時成功拆箱值類型,被拆箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的實例創(chuàng)建的。 嘗試取消裝箱 null 會導致 NullReferenceException。 嘗試取消裝箱對不兼容值類型的引用會導致 InvalidCastException。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持我們!
欄 目:C#教程
下一篇:C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實例
本文標題:C# 裝箱和拆箱的知識回顧
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6077.html
您可能感興趣的文章
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#及WPF獲取本機所有字體和顏色的方法
- 01-10同步調(diào)用和異步調(diào)用WebService
- 01-10C#編程自學之數(shù)據(jù)類型和變量二
- 01-10C#編程自學之數(shù)據(jù)類型和變量三
- 01-10C#編程自學之運算符和表達式
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#編程自學之類和對象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學之數(shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文