[原创]Box and Unbox
利用ILDASM工具,清楚装箱和拆箱的执行的步骤,实例来自:
——————>是一本好书(推荐)
代码详细说明下,并总结!
先来看下面一段程序清单:
using System;
class cunmang
{
static void
{
int foo=42;
Object bar=foo;
}
}
OK,编译一下,当然编译好的了的IL,下面用ILDASM工具打开刚才编译的,如图:
其中,有关IL的使用方法,请查看帮助,我这里只给个图片的截图:
对于本文章,其他的一些内容就不介绍了,我们直接看下主函数Main(),如图:
分析:首先说明这个是一个安全的代码,是托管的!
.locals init ([0] int32 foo, [1] object bar)
说明有2个变量,第一个是int32类型的 foo,一个是Object类型的 bar ! IL_0000: ldc.i4.s 42 说明把42装进堆栈里,以32位的形式存放。
IL_0002: stloc.0
后面的0说明是把第一个参数放进局部变量foo里//(我们都知道,赋值运算是右结合性的,也就是说是从右往左运算的,所以这里的代码也就是我们写的foo=42;)
IL_0003: ldloc.0
把这个局部变量压到堆栈中去了,也就是说,在堆栈中用变量名foo来表示42
IL_0004: box [mscorlib]System.Int32
看到box这个词了吗??也就是说开始装箱了,把原类型为(System.Int32)的foo进行装箱 。要知道原类型,我们可以使用foo.GetType()!
IL_0009: stloc.1
IL_000a: ret
参数1 就是把结果赋值给第二个参数,然后结束(ret)!
拆箱代码清单如下:
看一下多了什么?
IL_0009: stloc.1
IL_000a: ldloc.1
IL_000b: unbox [mscorlib]System.Int32
IL_0010: ldind.i4
IL_0011: stloc.2
IL_0012: ret
// end of method cunmang::Main
OK,当执行到object bar=foo;的时候,执行 IL_000a: ldloc.1 把bar装进堆栈中去
IL_000b: unbox [mscorlib]System.Int32
开始unbox(拆箱)成32位的整型 并 IL_0011: stloc.2 返回给第3个参数tbar
――――――――――――――――――――――――――――――――――――――――
总结:我听别人建议少用装箱和拆箱,在这里,当你改变foo的值,bar的值不变,或者改变bar的值,tbar的值却是不会改变,也就是说对于装箱还是拆箱,都是把原数据拷贝一份的,那么,装箱和拆箱用多了,也就存在浪费了!呵呵,这个是我的一点拙见,欢迎大家一起讨论!