輕松進修C#的裝箱與拆箱。本站提示廣大學習愛好者:(輕松進修C#的裝箱與拆箱)文章只能為提供參考,不一定能成為您想要的結果。以下是輕松進修C#的裝箱與拆箱正文
起首看一看甚麼是裝箱和拆箱?
簡略的來講:
裝箱就是值類型轉換為援用類型;
拆箱就是援用類型轉換為值類型。
值類型,包含原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、列舉 (enum) 、構造 (struct)。
援用類型包含類、數組、接口、拜托、字符串等。
裝箱:值類型到援用類型或到此值類型所完成的任何接口類型的隱式轉換
例如: int temp = 3;
System.Object obj = temp;
個中,temp為值類型,在棧平分配;當分派obj這個援用類型時,我們須要在堆平分配一個obj對象,然後把temp值賦給它,這麼一系列的進程就是裝箱的進程。
拆箱:從援用類型就任意值類型的顯式轉換。與裝箱分歧,拆箱式顯示轉換。
例如:int temp = 3;
System.Object obj = temp;
int i = (int) obj;
拆箱進程中,起首來肯定對象obj為一個值類型的裝箱值,然後把值賦給值類型。
隱式轉換總會勝利的情形,不會拋出異常:
(1)、從派生類到基類;
(2)、從派生接口到基接口;
(3)、從類到接口(該類完成了接口);
(4)、從Null就任何類;
顯式援用轉換,以下能夠拋出異常,轉換紛歧定勝利:
(1)、從基類到派生類;
(2)、從接口到接口(基接口到派生接口或許倆接口沒有關系);
(3)、從接口到類(該類完成了該接口或該類未關閉);
(4)、從類到接口(該類未完成該接口且該類未關閉);
下面簡略的引見了拆箱和裝箱的界說,上面就來評論辯論一下裝箱和拆箱與堆和棧如何應用
個中值類型是在棧平分配內存,自己的聲明就是一個初始化的進程,其不須要停止渣滓收受接管,只需超越所界說的感化規模會主動釋放內存,而援用類型則是在堆平分配的,和java一樣,在堆種分派內存,而其托管堆停止渣滓收受接管。當兩種數據類型停止轉換時就引出了裝箱/拆箱。
比擬裝箱和拆箱的優缺陷
裝箱和拆箱固然知足了兩只類型之間的轉換。然則從裝箱的進程中不好看出,每次裝箱時要在堆中new一個新的對象,當量特殊年夜是確定會年夜年夜影響法式的效力。事物總有兩面性,every sword has two sides,工作便簡略了,機能也上去了。所以,在運用中,我們應當盡可能防止裝箱操作。
懂得了裝箱和拆箱的操作,我們可以清晰的明確:裝箱操作會招致數據在堆和棧長進行拷貝,頻仍的裝箱操作會機能喪失。而比擬而言拆箱進程對機能消耗照樣比擬小的。
裝箱和拆箱的具體步調
1、裝箱(box)的具體步調:
(1)、在堆上分派一個內存空間,年夜小等於須要裝箱的值類型對象的年夜小加上兩個援用類型對象都具有的成員:類型對象指針和同步塊援用。
(2)、把客棧上的值類型對象復制到堆上新分派的對象。
(3)、前往一個指向堆上新對象的援用,而且存儲到客棧上被裝箱的誰人值類型的對象裡。
這個步調不須要法式員本身編寫,在任何湧現裝箱的處所,編譯器會主動加上履行以上功效的IL代碼。
所謂的拆箱就是裝箱對應著的概念,但拆箱的進程和裝箱其實不是倒過去就是:
2、拆箱(unbox.any)的具體步調
假如為待拆箱對象為null,拋出NullReferenceException異常。
假如援用指向的不是一個希冀對象的已裝箱對象,拋出InvalidCastException異常。
(1)、獲得已裝箱對象中各個字段的地址,這個進程就是“拆箱”
須要解釋的是普通拆箱今後會隨同著對象的拷貝,但拷貝操作曾經不是拆箱的領域。
上面舉兩個小的例子來完成甚麼是裝箱、拆箱和如何防止因頻仍的裝箱而消耗內存
(1)、裝箱:
using System; public class Test { public static void Main(String[] args) { int i = 10; //將值類型的i裝箱 //須要留意的是:這裡的裝箱采取的是值的拷貝 object obj = i; //磨練能否裝箱勝利了 if(obj is int) { Console.WriteLine("數據曾經裝箱!"); } //我們在這裡更改i的值 i = 33; Console.WriteLine("int i如今的值是:{0}",i); Console.WriteLine("int i裝箱的值是:{0}",obj); } }
(2)、拆箱:
int i = 10; object obj = i; int j = (int)obj; (3)、防止頻仍的裝箱: int i = 10; int j = 20; int s = 30; Console.WriteLine("i的值為{0},j的值為{1},s的值為{2}", i.ToString(), j.ToString(), s.ToString());
以上就是引見了C#的裝箱與拆箱,思緒很清楚,觸及的內容很周全,包含裝箱和拆箱的優缺陷、裝箱和拆箱的步調等,很合適初學者停止進修。