第七章 运算符和类型强制转换
1.条件运算符
条件运算符(:?)也成为三元运算符,是if…else结构的简化形式。它首先判断一个条件,如果为真,就返回第一个值,如果田间为假,则返回另一个值,语法如下:
Condition?true_value:false_value
其中condition为要判断的bool表达式,true_value是condition为true时的返回值。
2.as运算符
as运算符用于执行引用类型的显示类型转换。如果要转换的类型与指定类型兼容,转换就会成功进行,如果不兼容,as就会返回null值。例如:
object o1 = "something";
object o2 = 5;
string s1 = o1 as string;// s1="something"
string s2 = o2 as string;//s2=null
3.可空类型
在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用的影响,通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个都是null,则结果就是null,如下:
int? a = null;
int? b = a + 4;//b=null
int? c = a * 5;//c=null
但是在比较可空类型时,只要有一个操作数时null,比较结果就是false。即不能因为一个条件是false,就认为该条件的对立面是true。
4.空合并运算符
空合并运算符(??)提供了一种快捷方式,可以在处理空类型和引用类型时表示null的可能值。这个运算符放在两个操作数之间,第一个 操作数必须是一个可空类型或引用类型,第二个操作数必须和第一个操作数的类型相同,或者可以隐含地转换为第一个操作数的类型。合并运算符的计算如下:
如果第一个操作数不是null,整个表达式就等于第一个操作数的值。
如果第一个操作数是null,整个表达式就等于第二个操作数的值。
5.类型安全性-类型转换
1.隐式转换
只要能保证值不会发生任何变化,类型转换就可以自动(隐式)进行。
源类型 |
目的类型 |
Sbyte |
Short,int,long,float,double,decimal,bigInteger |
Byte |
Short.ushort,int,uint,long,ulong,float,double,decimal,biginteger |
short |
Int,long,float,double,decimal,bigInteger |
ushort |
Int,uint,long,ulong,float,double,decimal,BigInteger |
int |
Long,float,double,decimal,bigInteger |
uint |
Long,ulong,float,double,decimal,bigInteger |
Long,ulong |
Float,double,decimal,biginteger |
float |
Double,BigInteger |
char |
Ushort,int,uint,long,ulong,float,double,decimal,BigInteger |
可空类型隐式转换为其他类型:
- 可空类型隐式地转换为其他可空类型,因遵循上表非可空类型的转换规则。
- 非可空类型隐式的转换为可控类型,也应该遵循上表的转换规则,即int转换为long?、float?、double?、decimal?
- 可空类型不能隐式的转换为非可空类型,此时必须进行显示转换。
2.显示转换
有许多场合不能隐式地转换类型,,否则编译器会报告错误。下面是不能隐式转化的一些场合:
- Int转为short------会丢失数据
- Int转为uint------会丢失数据
- Uint转为int------会丢失数据
- Float转为int------会丢失小数点后面所有的数据
- 任何数字类型转为char------会丢失数据
- Decimal转为任何数字类型------因为decimal的内部结构不同于整数和浮点数
- Int?转换为int---可空类型的值可以是null
但是可以使用类型转换显示地执行这些转换。
Long val=300000000;int i=(int) val;在本例中不会报告错误,但也得不到期望的结果。C#提供了checked关键字,使用它可以测试操作是否会导致算数溢出。Int i=checked((int) val);
注意:所有的显式类型转换都可能不安全,在应用程序中赢包含代码来处理可能失败的类型强制转换。
6.装箱和拆箱
装箱和拆箱可以把值类型转换为引用类型,并把引用类型转换回值类型。只能对以前装箱的变量进行拆箱。在拆箱时,必须非常小心,确保得到的变量有足够的空间存储拆箱的值中的所有字节。例如,c#的int只有32位,所以把long值64位拆箱为int,会导致错误。