查了下资料,大致知道装箱与拆箱是将值类型与引用类型进行转换。可是为什么要进行这样的转换呢?
我个人的理解,Boxing和Unboxing的作用主要是在于泛型利用方面的考虑,也可以说是微软在C#这个strong-typed的语言上对于weak type的一种妥协。
思考一下如下的情景:
比如我们要做个计算器,这时候自然的处理方式是做个stack,然后把输入进来的数字暂存起来,等到碰到运算符时再取出来。更理想的解决方法是把运算符一起存在stack上,然后等到碰到等于号时再处理stack中的东西。可是因为C#是强类型语言,一个stack上不能同时放int型和char(+-×/)或者相关的operand类。所以解决方法就是把他们Box起来,统一包装成object型,再把栈声明成object类,这样就都能放在栈里了。到时候处理的时候再根据情况unbox,恢复成一开始的类型。
对于值类型而言,将其转换为类类型的过程称为装箱,将类类型转为值类型的过程称为拆箱。
比如String.Format(string, object...)格式化字符串函数,在不考虑cli优化的前提下,如果调用方式为string.Format("number is {0}", 1);则int类型的1会发生装箱变为object。
首先,你要理解基本数据类型与引用数据类型的存放模型。涉及到两个地方,一个是堆(stack),一个是堆栈(heap)。
1、对于基本数据类型,使用的是heap进行数据的保存,即每一个变量都指向heap中的一个内存单元。
2、对于引用数据类型,那就不一样了。引用数据中的变量名是存放在heap中的,而真正的数据是存放在stack中的一块内存区域中的。
所以,装箱操作,将基本数据类型转化为引用数据类型,需要为其在stack中创建一系列的额外内容,比如:
对于i 只是存放在堆栈中,而j,除了在堆中保存其变量值外,还需要在堆中存放其他的一些方法,比如toString()等等。
拆箱操作,即是stack中的数据不再需要了,但是要根据是否可行将对象转化为普通的数据类型。
另外,一个最直观的现象就是,基本数据类型(值类型)没有方法,只有值,而对象类型,除了值,还有自己的方法。这就是装箱与拆箱操作的必要性。
希望对你有帮助,欢迎浏览我的个人网站