八:强制类型转换

CLR允许将一个对象强制转换成它原来的类型或者它和任何基类型。C#要求将一个对象显式的转换成它的任何派生类型,因为这样的转型可能在运行时失败。以下代码演示了如何转换成基类型和派生类型:

using System;

internal class Employee

    //...

}

public sealed class Program

{

    public static void Main()

    {

        //不需要转型,因为new返回一个Employee对象,而object是Employee的基类型

        object o = new Employee();

        //需要转型,因为Employee从object派生

        Employee e = (Employee)o;

    }

}

使用is和as进行转换:

  is操作符是检查一个对象是否兼容于指定的类型,并返回Boolean值,如下所示:

  object o = new Employee();

  Boolean b1 = (o is object);//b1为true

  Boolean b2 = (o is Employee);//b2为false

  假如对象引用为null,那么is操作符总是返回false,is操作符通常这样使用:

  if (o is Employee)

  {
    Employee e = (Employee)o;

  //...使用e

  }

  在这段代码中CLR会检查两次对象的类型,is操作符先要核实o是否兼容于Employee类型,如果是,那么那么在执行了if语句内容的转型时,CLR再次核实o是否引用一个Employee,这对行性能造成了一定的影响,因为CLR首先必须判断变量o引用的对象的实际类型。然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型Employee,在这方面C#提供了as操作符,不但简化了写法,还提高了性能。

  Employee e = o as Employee;

  if (e != null)

  

  //...使用e

  }  

  上述代码,CLR首先核实o是否兼容于Employee类型,如果是,as会返回对同一个对象的非null引用,如果不是则返回null,这段代码CLR只校验了一次对象的类型,大大提高性能。 


posted @ 2009-01-23 01:14  Done  阅读(474)  评论(0编辑  收藏  举报