第五章 变量的更多内容
本章内容:
● 如何在类型之间进行隐式和显式转换
● 如何创建和使用枚举类型
● 如何创建和使用结构类型
● 如何创建和使用数组
● 如何处理字符串值
首先要讨论的主题是类型转换,即把值从一种类型转换为另一种类型。
接着阐述另外一些类型的变量:
枚举——变量类型,用户定义了一组可能的离散值,这些值可以用人们能理解的方式使用。
结构——合成的变量类型,由用户定义的一组其他变量类型组成。
数组——包含一种类型的多个变量,可以以索引方式访问各个数值。
这些类型比前面使用的简单类型复杂一些,但可以使工作更容易完成。最后,学习另一个与字符串相关的主题——基本字符串处理。
5.1 类型转换
类型转换采用以下两种形式:
隐式转换:从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。
显式转换:从类型A到类型B的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的处理。
5.1.1 隐式转换
隐式转换不需要做任何工作,也不需要另外编写代码。考虑下面的代码:
var1 = var2;
如果var2的类型可以隐式地转换为var1类型,这个赋值语句就涉及到一个隐式转换。它也可能只处理相同类型的两个变量,不需要隐式转换。例如,ushort和char的值是可以互换的,因为它们都可以存储0~65535之间的数字,在这两个类型之间可以进行隐式转换,如下面的代码所示:
ushort destinationVar; char sourceVar = 'a'; destinationVar = sourceVar; Console.WriteLine("sourceVar val: {0}", sourceVar); Console.WriteLine("destinationVar val: {0}", destinationVar);
这里存储在sourceVar中的值放在destinationVar中。在用两个Console.WriteLine()命令输出变量时,得到如下结果:
sourceVar val: a destinationVar val: 97
即使两个变量存储的是相同的信息,使用不同的类型解释它们时,方式也是不同的。
简单类型有许多隐式转换;bool和string没有隐式转换,但数值类型有一些隐式转换。表5-1列出了编译器可以隐式执行的数值转换(记住,char存储的是数值,所以char被当作一个数值类型)。
这些类型的隐式转换规则是:任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B。
其原因是很简单的。如果要把一个值放在变量中,而该值超出了变量的取值范围,就会出问题。例如,short类型的变量可以存储0~32767的数字,而byte可以存储的最大值是255,所以如果要把一个short值转换为byte值,就会出问题。如果short包含的值在256~32767之间,相应数值就不能放在byte中。
但是,如果short类型变量中的值小于255,就应能转换这个值,对吗?答案是可以。具体地说是可以,但必须使用显式转换。执行显式转换有点类似于“我已经知道你对在这么做提出了警告,但我将对其后果负责”。