**:
裝箱(boxing)和拆箱(unboxing)是c#型別系統的核心概念.是不同於c與c++的新概念!,通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.
c#語言中的所有型別都是由基類system.object繼承過來的,包括最常用的基礎型別:int, byte, short,bool等等,就是說所有的事物都是物件。如果申明這些型別得時候都在堆(heap)中分配記憶體,會造成極低的效率!(個中原因以及關於堆和棧得區別會在另一篇裡單獨得說說!)
.net如何解決這個問題得了?正是通過將型別分成值型(value)和引用型(regerencetype),c#中定義的值型別包括原型別(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal)、列舉(enum)、結構(struct),引用型別包括:類、陣列、介面、委託、字串等。
值型就是在棧中分配記憶體,在申明的同時就初始化,以確保資料不為null;
引用型是在堆中分配記憶體,初始化為null,引用型是需要garbage collection來**記憶體的,值型不用,超出了作用範圍,系統就會自動釋放!
下面就來說裝箱和拆箱的定義!
裝箱就是隱式的將乙個值型轉換為引用型物件。比如:
int i=0;
syste.object obj=i;
這個過程就是裝箱!就是將i裝箱!
拆箱就是將乙個引用型物件轉換成任意值型!比如:
int i=0;
system.object obj=i;
int j=(int)obj;
這個過程前2句是將i裝箱,後一句是將obj拆箱!
再寫個**,看看進行了幾次裝拆箱!
int i=0;
system.object obj=i;
console.writeline(i+","+(int)obj);
其中共發生了3次裝箱和一次拆箱!^_^,看出來了吧?!
第一次是將i裝箱,第2次是輸出的時候將i轉換成string型別,而string型別為引用型別,即又是裝箱,第三次裝箱就是(int)obj的轉換成string型別,裝箱!
拆箱就是(int)obj,將obj拆箱!!
在c#中,將類和陣列等都歸為了引用型的,那麼值型別和引用型有什麼區別呢?
值型別的變數包含自身的資料,而引用型別的變數是指向資料的記憶體塊的,並不是直接存放資料。對於值型別,每個變數都有乙份自己的資料複製,對另乙個值型別變數的操作並不影響這乙個變數的值。
而對於引用型別,兩個變數有可能引用同一物件,因此對乙個變數的操作會影響到另乙個變數。
值型別:
(1) int a=0;
(2) int b=a;
(3) int b=10;
(2)之後,a,b均為0,但是(3)之後,b=10, a=0; 對b的重新附值並不影響a
引用型別:
using system;
class valueclass
class text,」,a.value,b.value);
}}
輸出結果:10,10
就相當於指標,兩個變數指向同一塊記憶體資料,當乙個變數對記憶體區資料改變之後,另乙個變數指向的資料當然也會改變。
C 的裝箱和折箱
c 的裝箱和折箱 2007年10月15日 星期一 上午 10 50 在學習裝箱和折箱之前,我覺得有必要介紹一下c 中的 值型別 和 引用型別 以下觀點僅是個人學習心得和體會,不足之處多多指教 先說一下c 中的 值型別 和 引用型別 這個先要從c 的原理中才好理解 值型別 它的資料儲存在記憶體中的堆疊...
匯入 全面認識裝箱與折箱
學c 有近一年了,對裝箱與拆箱有了一定的了解,但昨天晚上看了.framework程式設計後,才發現自己的認識都只是片面的。首先說明 為什麼要清楚裝箱與折箱,因為裝箱與折箱對程式的效能有很大的影響,因此在寫 的時候要時刻注意這些問題。裝箱與折箱都只對值型別資料而言,而對於引用型別資料,都是在託管的堆上...
C 裝箱與拆箱
要掌握裝箱與拆箱,就必須了解cts及它的特點。net重要技術和基礎之一的cts common type system 顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。net將整個系統的型別分成兩大類 value type 和 reference type...