C#的装箱与拆箱

来源:互联网 发布:java线程池参数 编辑:程序博客网 时间:2024/04/29 20:04

原则:

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这个万类之祖

原创粉丝点击