



一般情况下,不同类型的变量使用不同的模式来表示数据。这意味着,即使可以把数据从一种类型的变量移动到另一种类型的变量中(也许这两种类型占用的存储空间相同,也许目标类型有足够的存储空间包含移动的源数据),结果也可能与期望的不同。这种期望并不是数据从一个变量到另一个变量的一对一映射,而是需要对数据进行合理的类型转换。
类型转换有以下两种形式。
隐式转换:是指从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器进行。
显式转换:是指从类型A到类型B的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的强制转换处理。
隐式类型转换就是不需要声明就能进行的转换。比如,将低精度数值转换为高精度数值,可以直接赋值而不需要使用任何转换标识符。在进行隐式类型转换时,编译器不需要进行检查就能安全地进行转换。
【例3.20】 把int类型隐式转换为double类型的代码如下:
从上面的示例代码中可以看出,隐式类型转换操作十分简单,不需要使用任何标识符,低精度的变量值可以直接赋值给高精度的变量。但隐式类型转换并不是可以在任意的数据类型间进行,表3.3列出了可以进行隐式类型转换的数据类型。
表3.3 隐式类型转换表CTS类型
学习手册
说明
从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但不会影响它的数量级。其他隐式转换不会丢失任何信息。
显式类型转换也可以称为强制类型转换,它需要在代码中明确地声明要转换的类型,若在不存在隐式转换的类型之间进行转换,则需要使用显式类型转换。比如,将高精度数值转换为低精度数值,必须指明将要转换的目标类型,但由于数据类型的差异,有可能会丢失部分数据。
【例3.21】 把double类型显式转换为int类型的代码如下:
实例运行结果如图3.14所示。
图3.14 double类型显式转换为int类型
除了像上面那样可以使用类型标识符进行强制类型转换外,还可以通过Convert关键字进行显式类型转换,上面的例子还可以通过下面的代码实现。
【例3.22】 通过Convert类可实现在例3.21中的功能,代码如下:
装箱是指将值类型转换为引用类型的过程,而拆箱是指将引用类型转换为值类型的过程。相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。在对值类型进行装箱时,必须分配并构造一个全新的对象;而拆箱所需的强制转换也需要进行大量的计算,因此装箱和拆箱会对程序的执行性能有影响。
装箱操作是指将值类型转换为引用类型的过程,装箱操作通常是隐式类型转换。
【例3.23】 将int类型的变量i进行装箱操作,代码如下:
学习手册
说明
对值类型变量的值进行装箱操作,其实就是分配一个对象实例,并将值类手册型变量的值复制到该对象实例中。
【例3.24】 创建一一个控制台应用程序,声明一一个整型变量i并赋值为123,然后将其复制到装箱对象obj中,最后再改变变量i的值。代码如下:
程序运行结果如图3.15所示。
图3.15 装箱操作
从程序运行结果可以看出,将值类型变量的值复制到装箱得到的对象中之后,改变值类型变量的值,并不会影响装箱对象的值。
拆箱操作是将引用类型转换为值类型的过程,拆箱操作通常是显式类型转换。拆箱的执行过程大致可以分为以下两个阶段。
(1)检查对象的实例,看它是不是值类型的装箱值。
(2)把这个实例的值复制给值类型变量。
【例3.25】 创建一一个控制台应用程序,声明一一个整型变量i并赋值为123,然后将其复制到装箱对象obj中,最后,进行拆箱操作,将装箱对象obj赋值给整型变量j。代码如下:
程序运行结果如图3.16所示。
图3.16 拆箱操作
从程序运行结果可以看出,拆箱后得到的值类型变量的值与装箱对象的值相等。
学习手册
注意
在执行拆箱操作时,要符合类型一致的原则,否则会出现异常。比如,将一个字符串进行了装箱操作,那么在对其进行拆箱操作时,一定是拆箱为字符串类型。