C#隐式转换与显示转换
System.Objec时C#中所有类型的基类,也就是万类之源。
一、值类型
值类型都继承自System.ValueType(派生自System.Objec),继承自System.ValueType的类型在CLR中具有特殊的行为,值类型变量直接包含它们的值。对于值类型变量,没有单独的堆分配或垃圾回收开销。
值类型分为两类:结构和枚举
1.结构
值类型为“密封”,也就是结构类型不能派生类型,并且不能把结构类型定义为从任何用户定义的类或结构继承,因为结构只能继承自System.ValueType。但是一个结构可以继承一个或多个接口。可将结构类型强制转化为Object类型或任何它所继承的接口类型,但这会发生装箱操作。
2.枚举
枚举定义的一组已命名的整型变量。所有的枚举都继承自System.Enum(继承自System.ValueType)。适用于结构的规则也适用于枚举。
二、引用类型
定义为类、接口、委托或数组的类型都是引用类型。在运行时,当声明引用类型的变量时,该变量为一直包含值null,直至使用new运算符显示创建对象,或为该变量分配已在其他位置使用new创建的对象。
三、装箱与拆箱
装箱:将值类型转化为Object类型或由此之类型实现的任何接口类型的过程。CLR对值类型进行装箱操作时,会将值包装到System.Object内部,再将后者存储托管堆中。
拆箱:拆箱就是从对象中取出值类型。
装箱是隐式的,拆箱是显式的。性能上,装箱和拆箱会造成一定的性能损失。对值类型进行装箱时必须分配并创建对象,拆箱时的强制转换也需要进行大量的计算。值得注意的是拆箱强转的值类型应与装箱时的值类型一致。