类型转换快速预览
C# 支持类型的隐式转换和显式转换。隐式转换有CLR自动完成,显式转换可以通过cast操作来完成。先来预览下C# 中的类型转换。
隐式转换
//基本类型转换
int i = 1;
long l = 2;
l = i;
//引用类型转换
Fruit f = new Fruit();
Apple a = new Apple();
f = a;
上面的代码没有任何问题。C# 中的类型转换都遵守一个向上转换的原则,即具体的转换为抽象的没问题,但是向下转换就会报错。例如,下面的代码就会报错。
l = i;
f = a;
显式类型转换
显式类型转换通过cast操作来完成,具体如下:
//基本类型转换
int i = 1;
long l = 2;
i = (int)l;
//引用类型转换
Fruit f = new Apple(); //注意这里基类的引用指向了一个派生类
Apple a = (Apple)f;
但是请注意,对于引用类型,不管是隐式转换还是显式转换,将基类转换成派生类都是通不过的。
检查数据溢出
但是在将long类型的数据显式转会int类型的时候可能会出现数据溢出,因为long能表示的数字比int大很多。虽然系统不会报错,但我们还是希望能够在数据溢出的时候能够做些事情,这就需要用到数据溢出检查。这是通过checked和unchecked来完成的,并使用try...catch语句来捕获溢异常。
int i = 1;
long l = 70000000000;
try {
i = checked((int)l);//checked语句检查一条语句
} catch (OverflowException e) {
Console.WriteLine(e.ToString());
}
checked也可以检查多条语句,把要检查的语句放在checked { } 语句块中就可以了。
类型检查
很多时候,我们希望知道要操作的对象的确切类型,C# 提供了类型检查功能。
获取对象的类型
Type方法实用类可以帮助我们获取对象的类型。
//B:A
A a = new B();
Type t = a.GetType();
Console.WriteLine(t.ToString());
//输出:B
CLR总是知道一个对象的确切类型,即使引用它的是它的基类变量。
IS操作符
Is操作符用来判断左边的操作数是否属于右边操作数类型,返回ture或false
//B:A
A a = new B();
B b;
if (a is B ) {
b = a;
}
AS操作符
AS和IS操作符相似,区别在于如果左边的对象属于右边的类型则返回该对象的一个引用,否则返回null。
//B:A
A a = new B();
B b = a as B ;
if (b != null) {
//do something
}
Is操作符和as操作符都不会报错,而只是在做出判断后返回相应的值,这增加了我们编写代码的安全性。