八:强制类型转换
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只校验了一次对象的类型,大大提高性能。