c#中的装箱(boxing)和拆箱(unboxin)

  c#中的装箱(boxing)和拆箱(unboxin

给一个值装箱(boxing)指隐式地把任何值类型转换成类型对象。当一个值类型被装箱(boxing)时,一个对象实例就被分配,且值类型的值被拷贝给新的对象。
看以下例子:
int nFunny = 2000;
object oFunny = nFunny;
第二行的赋值暗示调用一个装箱(boxing)操作。nFunny整型变量的值被拷贝给oFunny对象。现在整型变量和对象变量都同时存在于栈中,但对象的值居留在堆中。
那么,它暗示着什么呢?它们的值互相独立——在它们之间没有连接。(oFunny没有引用nFunny的值。) 以下代码说明了结果:
int nFunny = 2000;
object oFunny = nFunny;
oFunny = 2001;
Console.WriteLine("{0} {1}", nFunny, oFunny);
 
程序输出结果是:
2001 2000

当代码改变oFunny的值时,nFunny的值并没有改变。只要你脑袋中有这个copy动作,就能够使用值类型的对象功能,发挥出你的巨大优势!
 
拆箱(unboxin)
和装箱(boxing)相比,拆箱(unboxin)是显式操作——必须告诉编译器,你想从对象中抽取出哪一种值类型。当执行消框操作时,C#检测所请求的值类型实际上存储在对象实例中。经过成功的校验,该值被消框。
这就是消框如何执行:
int nFunny = 2000;
object oFunny = nFunny;
int nNotSoFunny = (int)oFunny;
如果错误地请求一个double值
double nNotSoFunny = (double)oFunny;
通用语言运行时(Common Language Runtime,简写CLR)将会引发一个InvalidCastException异常。
 

你可能感兴趣的:(c#中的装箱(boxing)和拆箱(unboxin))