第五章 变量的更多内容
- 枚举-变量类型,用户定义了一级可能的数值,这些数值可以用人类能理解的方式使用。
- 结构-合成的变量类型,由用户定义的一组其他变量类型组成。
- 数组-包含一种类型的多个变量,可以用下标全工作更容易完成。
1,类型转换
类型转换有两种形式:
- 隐式转换:从类型A到类型B的转换可以在所有的情况下进行,执行转换的规则非常简单,可以让编译器进行。
- 显式转换:从类型A到类型B的转换只能在某些情况下进行转换的规则比较复杂,应进行某种类型的处理。
(1)隐式转换
示例:ushort和char的值是可以互换的,因为它们都可以存储0~65535之间的数字,在这两个类型之间可以进行隐式转换,例如下面的代码:
char sourceVar = ' a ' ;
destinationVar = sourceVar;
Console.WriteLine( " sourceVar val: {0} " , sourceVar);
Console.WriteLine( " destinationVar val: {0} " , destinationVar);
这里存储在sourceVar中的值 放在destinationVar中。
输出结果:
sourceVar val: a
destinationVar val:97
即使两个变量存储的是相同的信息,使用不同的类型解释它们时,方式也是不相同的。
简单类型有许多隐式转换:bool和string没有隐式转换,但数值类型有一些隐式转换。
下表列出了编译器可以隐式执行的数值转换(char存储的是数值,所以char被当作一个数值类型)。
类型 可以安全的转换为
byte short,ushort,int uint ,long,ulong,float,doubledecimal
sbyte short,int long,float,double,decimal
short int,long,float,double,decimal
ushort int,uint,long,ulong,float,double,decimal
int long,float,double,decimal
uint long,ulong,float,double,decimal
long float,double,decimal
ulong float,double,decimal
float double
char ushort,int,uint,long,ulong,float,double,decimal
这些类型的隐式转换规则是任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B。
例如,short类型的变量可以存储0~32677的数字,而byte可以存储的最大值是255,所以如果要反一个short值转换为byte值,就会出问题。如果short包含的值在256~32767之间,该数值就不能放在byte中。
如果short类型变量中的值小于255,就可以转换这个值。但必须使用显式转换。
(2)显式转换
short sourceVar = 7 ;
destinationVar = sourceVar;
Console.WriteLine( " sourceVar val: {0} " , sourceVar);
Console.WriteLine( " destinationVar val: {0} " , destinationVar);
如果编译这段代码,就会产生一个编译错误,为了成功编译这段代码,需要添加代码,进行显式转换。
数据类型转换就是强迫数据从一种类型转换为另一种类型,其语法:
(destinationType)sourceVar
*彼此之间没有什么关系的类型不能进行数据转换。
所以上面第三行代码应改为
destinationVar = (byte)sourceVar;
得到如下结果:
sourceVar val: 7
destinationVar val: 7
在试图把一个值转换为不合适的变量时,会发生什么呢?修改代码:
结果如下:
sourceVar val: 281
destinationVar val: 25
如果看看这两个数字的二进制表示,以及可以存储在byte中的最大值255:
281=100011001
25 =000011001
255=011111111
可以看出,源数据的最左边一位丢失了。
这就引出一个问题,何时会丢失数据?所以我们需要知道当显式地把一种数据类型转换为另一种数据类型时,是否有数据丢失了。
一种方式就是用两个关键字:checked 和 unchecked,称为表达式溢出检查环境。
语法:
checked(expression)
unchecked(expression)
(3)使用Convert命令进行显式转换
Convert进行的显式转换:
命令 结果类型
Convert.ToBoolean(val); bool
Convert.ToByte(val); byte
Convert.ToChar(val); char
Convert.ToDecimal(val); decimal
Convert.ToDouble(val); double
Convert.ToInt16(val); short
Convert.ToInt32((val); int
Convert.ToInt64(val); long
Convert.ToSByte(val); sbyte
Convert.ToSingle(val); float
Convert.ToString(val); string
Convert.ToUInt16(val); ushort
Convert.ToUInt32(val); uint
Convert.ToUInt64(val); ulong
示例:
{
short shortResult, shortVal = 4;
int integerVal = 67;
long longResult;
float floatVal = 10.5F;
double doubleResult, doubleVal = 99.999;
string stringResult, stringVal = "17";
bool boolVal = true;
Console.WriteLine("Variable Convertion Examples\n");
doubleResult = floatVal * shortVal;//将float和short显式转换为double,然后相乘.doubleResult=10.5*4=42
Console.WriteLine("Implicit,->double: {0} * {1} -> {2}", floatVal, shortVal, doubleResult);
shortResult = (short)floatVal;//将float显示转换为short,然后赋值.shortResult=10.5
Console.WriteLine("Explicit,->short: {0} -> {1}", floatVal, shortResult);
stringResult = Convert.ToString(boolVal) + Convert.ToString(doubleVal);//将bool和double显式转换为string,然后相加.stringResult="True99.999"
Console.WriteLine("Explicit->string: \"{0}\" + \"{1}\" -> {2}", boolVal, doubleVal, stringVal);
longResult = integerVal + Convert.ToInt64(stringVal);//将sting显式转换为long,然后与int相加.longResult=67+17=84
Console.WriteLine("Mixed, ->long: {0} + {1} -> {2}", integerVal, stringVal, longResult);
Console.ReadKey();
}