购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 转换数据类型

一般情况下,不同类型的变量使用不同的模式来表示数据。这意味着,即使可以把数据从一种类型的变量移动到另一种类型的变量中(也许这两种类型占用的存储空间相同,也许目标类型有足够的存储空间包含移动的源数据),结果也可能与期望的不同。这种期望并不是数据从一个变量到另一个变量的一对一映射,而是需要对数据进行合理的类型转换。

类型转换有以下两种形式。

隐式转换:是指从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器进行。

显式转换:是指从类型A到类型B的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的强制转换处理。

3.5.1 隐式类型转换

隐式类型转换就是不需要声明就能进行的转换。比如,将低精度数值转换为高精度数值,可以直接赋值而不需要使用任何转换标识符。在进行隐式类型转换时,编译器不需要进行检查就能安全地进行转换。

【例3.20】 把int类型隐式转换为double类型的代码如下:

从上面的示例代码中可以看出,隐式类型转换操作十分简单,不需要使用任何标识符,低精度的变量值可以直接赋值给高精度的变量。但隐式类型转换并不是可以在任意的数据类型间进行,表3.3列出了可以进行隐式类型转换的数据类型。

表3.3 隐式类型转换表CTS类型

学习手册 说明

从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但不会影响它的数量级。其他隐式转换不会丢失任何信息。

3.5.2 显式类型转换

显式类型转换也可以称为强制类型转换,它需要在代码中明确地声明要转换的类型,若在不存在隐式转换的类型之间进行转换,则需要使用显式类型转换。比如,将高精度数值转换为低精度数值,必须指明将要转换的目标类型,但由于数据类型的差异,有可能会丢失部分数据。

【例3.21】 把double类型显式转换为int类型的代码如下:

实例运行结果如图3.14所示。

图3.14 double类型显式转换为int类型

除了像上面那样可以使用类型标识符进行强制类型转换外,还可以通过Convert关键字进行显式类型转换,上面的例子还可以通过下面的代码实现。

【例3.22】 通过Convert类可实现在例3.21中的功能,代码如下:

3.5.3 什么是装箱和拆箱

装箱是指将值类型转换为引用类型的过程,而拆箱是指将引用类型转换为值类型的过程。相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。在对值类型进行装箱时,必须分配并构造一个全新的对象;而拆箱所需的强制转换也需要进行大量的计算,因此装箱和拆箱会对程序的执行性能有影响。

3.5.4 应用装箱和拆箱操作

1.装箱操作

装箱操作是指将值类型转换为引用类型的过程,装箱操作通常是隐式类型转换。

【例3.23】 将int类型的变量i进行装箱操作,代码如下:

学习手册 说明

对值类型变量的值进行装箱操作,其实就是分配一个对象实例,并将值类手册型变量的值复制到该对象实例中。

【例3.24】 创建一一个控制台应用程序,声明一一个整型变量i并赋值为123,然后将其复制到装箱对象obj中,最后再改变变量i的值。代码如下:

程序运行结果如图3.15所示。

图3.15 装箱操作

从程序运行结果可以看出,将值类型变量的值复制到装箱得到的对象中之后,改变值类型变量的值,并不会影响装箱对象的值。

2.拆箱操作

拆箱操作是将引用类型转换为值类型的过程,拆箱操作通常是显式类型转换。拆箱的执行过程大致可以分为以下两个阶段。

(1)检查对象的实例,看它是不是值类型的装箱值。

(2)把这个实例的值复制给值类型变量。

【例3.25】 创建一一个控制台应用程序,声明一一个整型变量i并赋值为123,然后将其复制到装箱对象obj中,最后,进行拆箱操作,将装箱对象obj赋值给整型变量j。代码如下:

程序运行结果如图3.16所示。

图3.16 拆箱操作

从程序运行结果可以看出,拆箱后得到的值类型变量的值与装箱对象的值相等。

学习手册 注意

在执行拆箱操作时,要符合类型一致的原则,否则会出现异常。比如,将一个字符串进行了装箱操作,那么在对其进行拆箱操作时,一定是拆箱为字符串类型。 lxy3YkmILTk98JpTMh+y5j++AtuxyK9pIZAkFUwTIzUrbm3ceRiRaTH7YMT2mZMF

点击中间区域
呼出菜单
上一章
目录
下一章
×