装箱和拆箱
装箱就是将值类型用引用类型包装起来转换为引用类型;而从引用类型中拿到被包装的值类型数据进行拆箱。
装箱过程其实就是把值类型拷贝到堆中,拆箱可以在引用类型中直接找到值类型存在的位置。如果一段代码中有装箱和拆箱的操作,在Reflector反编译器中,查看中间代码生成的IL语言,会有box,unbox命令。
例如:
N.Tostring()其实是在n中创建了一个对象
Int m=int.Psrse(s);这个不叫拆箱
Int n=10;
Conosle.Wtitline(n);
Object o=n;//一次装箱
console.WriteLine((int)o);//这是一次拆箱
Console.writeline(o);//这里输出的是字符串“10”,相当于Console.Writeline(o.ToString())
这个例题装箱一次拆箱一次
值得注意的是:引用类型和引用类型之间进行的操作不属于装箱和拆箱,装箱使用什么类型,拆箱也必须使用什么类型。
例如:
Chinese cn1=new Chinese();
Person p=cn1;
Chinese cn2=(Chinese)p;
就没有发生拆箱和装箱的问题。
要掌握拆箱和装箱,就必须了解CTS以及它的特点。.NET重要技术和基础之一的CTS(Common Type System)。CTS是为了实现在应用程序声明和使用这些类型时必须遵循的规则而存在的通用类型系统。.Net将整个系统的类型分成两大类 :值类型和引用类型。CTS中的所有东西都是对象;所有的对象都源自一个基类——System.Object类型。值类型的一个最大的特点是它们不能为null,值类型的变量总有一个值。为了解决值类型不可以为null,引用类型可以为null的问题,微软在.Net中引入了装箱和拆箱