第 8 讲:数据类型(五):类型转换
Part 1 类型需要转换吗?
数据决定了数据处理过程的模式和方法。当不同数据之间混用的时候,就必须要注意数据的转换。举个例子,int 和 double 是可以互相转换的,因为我们之前介绍字面量的时候,是允许数据直接赋值的。但 C# 是严谨的,这种转换是一种叫做隐式转换(Implicit Cast 或 Implicit Conversion)的机制才成功的;另外,C# 里也提供了一些复杂类型之间的转化。举个例子,string 类型的数据(字符串)显然是不可能转换为一个整数的。因为 string 里可以放任何东西进去,所以它里面不一定只有数字字符。因此,如果一个可能的只有数字的字符串转换为数值类型的话,它们之间就需要更为复杂的转换。
今天我们就需要给大家介绍这类东西。
Part 2 显式转换(强制转换)
我们允许一种语法形式:(T)变量,来表示变量强制转换(Explicit Cast 或 Explicit Conversion)为指定的类型。举个例子:
我们使用这个语法,在数值左侧写上 (int),表示将 35.5 这个字面量转换为 int 类型的数据。如果没有这个 int 类型的强制转换的话,赋值就会失败:因为右侧的是小数,左边是整数,小数可以表示的数据的范围较大,因此赋值会失败。
bool b = (bool)3; 以及 int i = (int)false; 类似于这样的语句一定是失败的——因为范围完全没有交集。
可以使用强制转换的类型有这样的一些:
float转所有的整数数据类型;double转所有的整数数据类型;double转float;decimal转所有的整数数据类型;decimal转float和double;整数类型转范围更小的整数数据类型。
但是,如果数据超出了可转换的范围的话,就会在运行期间产生转换数据的错误。
Part 3 隐式转换
俗话说,只要数据类型不同的时候,数据赋值就需要类型转换
显然,3 也可以是一个 double 类型的数据,即使这里写出来的 3 这个字面量本身是 int
隐式转换一般适用于所有取值范围较小转到较大的时候。只要范围更大的话,必然就可以完全包含全部较小的数据,那么写不写转换的话,C# 肯定都应该是允许的:因为 C# 知道,这样的转换必然是成功的。
当然了,你依然可以书写上强制转换的符号:
只是这个强制转换符号 (double) 完全可以不写出来。
Part 4 其它转换
显然,C# 里的字符串是不能给其它类型进行转换的。因为字符串本身是用字符拼凑起来的,而字符只是起到显示的作用:它并非真正的数值。
那么,我们想把一个只有数字字符构成的字符串,转换为一个数字的话,这怎么做呢?
4-1 字符串转其它数据类型
我随便写了这么几个。可以发现,直接将类型名称写出来,在后面追加 .Parse(字符串)
有意思的是,Parse 还能把字符串转成布尔数据。比如一个 "false" 字符串,里面是由 f、a、l、s、e 五个字母构成的只提供显示用的字符串。
所有基本数据类型都自带 .Parse 方法。你完全可以把字符串数据(变量、字面量)带入,然后就可以得到结果。
4-2 其它数据类型转字符串
如果反过来的话,我们使用是 数值.ToString() 这样的格式进行转换。
.ToString(),就可以转化为字符串。
4-3 布尔型转整数
前面介绍了很多数据类型,但很遗憾的是,布尔型无法和整数进行转化。学过 C 语言的朋友都知道,非 0 表示为真、0 表示为假;真表示成 1、假表示为 0。怎么说,布尔和整数都是可以转换的。
C# 里,布尔型数据是无法和整数进行互相转换的。因此,我们必须转换数据的话,唯一的办法是使用这样复杂的语句:
和 Convert.ToInt32 方法就专门转化这两种数据类型。但希望你注意,要使用这两个方法,你需要和 Console.WriteLine 一样,先写上 using System; 这条引用指令。
Part 4 综合示例
我们来看一则完整的 C# 程序:
Console.ReadLine 和 Console.WriteLine 方法的执行方向是相反的:Console.ReadLine 是在屏幕上通过用户输入,来读取一个字符串。输入的内容就会自动读入到左侧变量里。
然后,变量定义是可以不用赋初始数值的,因为 Console.ReadLine 可以读取信息给变量,因此没有必要给变量添加赋值过程。
比如,我输入的一些数据读入进去了之后,结果可以是这样的:
Part 5 总结
那么,至此我们就把数据类型的内容给大家介绍完毕了。前面我们学习了很多数据类型的知识点,比如说数据类型的意义、数据类型的转换、数据类型的使用方式等等。我想你对 C# 的数据类型有了一个基本的认识。没有关系,就算你没有完全记住它们。文档都是可以提供给你以后查看和参考的,所以不用担心忘记了。

