原则:
1、装箱:将值类型转化为引用类型
方法:通过创建临时对象,由.net后台执行
原因:在C#中值类型和引用类型存放的内存位置不同,所以转化的时候涉及到内存迁移,所以提供这样的技术来实现内存迁移
int i = 10;
string s = i.ToString();
这样是不行的,因为i是一个值类型,不能调用ToString方法
int i = 10;
object myObject = i; //这里执行装箱
string s = myObject.ToString();
在后台这样处理的,首先在堆内存创建一个实例化的string对象空间,将10转化成“10”放在这块内存空间,这个隐式的实例化对象temp然后让s这个引用类型所引用(用底层的看法来看,s这个指针拿到了temp对象堆内存地址),使用完成之后,s对象析构,temp对象内存空间释放回系统使用
2、拆箱:将装过箱的引用类型转化为值类型
注意:必须是前面装过箱的(重申:struct是值类型)
方法:将temp对象的值拿出来,赋值给个栈内存上的值类型的变量,如果是个普通的引用,.net不会做这种内存搬运动作,所以会抛出异常,而对于装箱后的引用,系统维护一张表格记录,对于在其中的引用进行赋值的时候,系统则会采用不同的动作,完成内存搬运工作。
(在拆箱完成的时候,个人认为引用不会释放temp对象内存,后面这个装箱的引用还能使用,直到系统检测到它可以回收,或者收工执行这个动作的时候)
3、装箱一般用处:
比如字面值,这是一个值类型,当想利用类的ToString方法时,需要是一个引用类型,这时候利用object这个万类之祖