?? 值類型的裝箱與拆箱.txt
字號(hào):
特點(diǎn):值類型,是比引用類型更為輕量級(jí)的類型,因?yàn)樗鼈儧]有被分配在托管堆中,不會(huì)被執(zhí)行垃圾收集,也沒有指向它們的指針.
原因:很多情況下,必須獲得一個(gè)指向值類型實(shí)例的引用(類似指針)。
裝箱(boxing):用來將一個(gè)值類型轉(zhuǎn)換為一個(gè)引用類型。
步驟如下:
a.從托管堆中為新生成的引用類型對(duì)象分配內(nèi)存。
b.將值類型實(shí)例的字段拷貝到托管堆上新分配對(duì)象的內(nèi)存中。
c.返回托管堆中新分配對(duì)象的地址。
C#/VB.NET 自動(dòng)裝箱。
C++ 必須編定代碼裝箱。
拆箱(unboxing):獲取已裝箱值類型的地址。
a.如果引用為null,將會(huì)拋出一個(gè)NullReferenceException異常。
例如:
object o=null;
Int16 y=(Int16)o;
b.如果引用對(duì)象與期望對(duì)象不同,將拋出一個(gè)InvalidCaseExceotion異常。
例如:
Int32 x=5;
object o=x;
Int16 y=(Int16)o;//拋出一個(gè)InvalidCaseExceotion異常
c.返回值類型的引用。
字段拷貝:將字段的值從托管堆拷貝到位于線程堆棧上值類型實(shí)例中。
拆箱+字段拷貝 裝箱 互反操作。
經(jīng)驗(yàn):
裝箱和拆箱/拷貝 從速度和內(nèi)存兩方面損傷應(yīng)用程序的性能。
目的:減少一些常用值類型的裝箱操作。
a.自已做裝箱操作,提高程序性能。object o=v;
b.一些類型的方法提供了重載版本,減少裝箱操作。
c.ToString(),返回引用,減少裝箱操作。
Int32 v=5;
object o=v;
v=123;
//Console.WriteLine(v+","+(Int32)o);//性能差
//Console.WriteLine(v+","+o); //性能較好
//Console.WriteLine(v.ToString()+","+o); //性能最好
注意:經(jīng)過裝箱的值類型實(shí)例(放在ArrayList中的p)的生存期超出了(大于)未裝箱的值類型(Point的p)生存期。
using System;
using System.Collections;
struct Point
{
public Int32 x,y;
}
class Hello
{
static void Main()
{
ArrayList a=new ArrayList();
Point p;
for(Int32 i=0;i<10;i++)
{
p.x=p.y=i;
a.Add(p); //裝箱(boxing)
}
for(Int32 i=0;i<10;i++)
{
p=(Point)a[i];//拆箱(unboxing)/拷貝(copy)
Console.WriteLine("Point(x,y)={0},{1}\n",p.x,p.y);
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -