类型判断与类型转换的应用

来源:互联网 发布:找人做淘宝网页 编辑:程序博客网 时间:2024/04/29 04:57

类型转换快速预览

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大很多。虽然系统不会报错,但我们还是希望能够在数据溢出的时候能够做些事情,这就需要用到数据溢出检查。这是通过checkedunchecked来完成的,并使用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操作符用来判断左边的操作数是否属于右边操作数类型,返回turefalse

//B:A

A a = new B();

B b;

if (is B ) {
       b = a;

}

AS操作符

ASIS操作符相似区别在于如果左边的对象属于右边的类型则返回该对象的一个引用,否则返回null

//B:A

A a = new B();

B b = a as B ;

if (!null) {
        //do something
}

Is操作符和as操作符都不会报错,而只是在做出判断后返回相应的值,这增加了我们编写代码的安全性。