C#学习笔记Day8

第七章 运算符和类型强制转换

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

 

         可空类型隐式转换为其他类型:

  1. 可空类型隐式地转换为其他可空类型,因遵循上表非可空类型的转换规则。
  2. 非可空类型隐式的转换为可控类型,也应该遵循上表的转换规则,即int转换为long?、float?、double?、decimal?
  3. 可空类型不能隐式的转换为非可空类型,此时必须进行显示转换。

2.显示转换

有许多场合不能隐式地转换类型,,否则编译器会报告错误。下面是不能隐式转化的一些场合:

  1. Int转为short------会丢失数据
  2. Int转为uint------会丢失数据
  3. Uint转为int------会丢失数据
  4. Float转为int------会丢失小数点后面所有的数据
  5. 任何数字类型转为char------会丢失数据
  6. Decimal转为任何数字类型------因为decimal的内部结构不同于整数和浮点数
  7. Int?转换为int---可空类型的值可以是null

但是可以使用类型转换显示地执行这些转换。

Long val=300000000;int i=(int) val;在本例中不会报告错误,但也得不到期望的结果。C#提供了checked关键字,使用它可以测试操作是否会导致算数溢出。Int i=checked((int) val);

注意:所有的显式类型转换都可能不安全,在应用程序中赢包含代码来处理可能失败的类型强制转换。

6.装箱和拆箱

装箱和拆箱可以把值类型转换为引用类型,并把引用类型转换回值类型。只能对以前装箱的变量进行拆箱。在拆箱时,必须非常小心,确保得到的变量有足够的空间存储拆箱的值中的所有字节。例如,c#的int只有32位,所以把long值64位拆箱为int,会导致错误。

猜你喜欢

转载自blog.csdn.net/weixin_39504659/article/details/85005570