(一)类型转换 is 和 as

c# 是强类型语言。

  CLR最重要的特性之一就是 类型安全,在运行时,CLR总是知道对象的类型是什么,C#所有的类的继承自system.Object ,所以都包含GetType方法,调用GetType方法,即可知道对象的确切类型。

类型转换:

  派生类向基类转换时,可以直接转换(隐式转换)。

  基类向派生类转换时,需要显示转换(注意这里如果要转换的对象不是“派生类类型或派生类的派生类型”,会在运行时抛出异常)。

使用 is 和 as 转换符

  C#语言还提供了另外一种类型转换的方式,is和as  

  is用来检查对象是否兼容指定类型,返回 true or false ,永远不会抛出异常。

eg:

1 if(o is Student)
2 {
3    var a = (Student)o;      
4 }

 上面的代码中  CLR实际上做了两次类型检查,如果每处类型转换都要这样写,那无疑对性能是有很大的影响的,所以C#提供了 as 操作符,目的就是简化上述代码,优化其性能。

eg :

1 var a = o as Student
2 if(a != null)
3 {
4     //TODO:  
5 }

as 操作符与is一样永远不会抛出异常,但是会直接类型转换操作,如果CLR发现对象无法转换为指定类型,会返回null值,这个时候我们只需要判断对象是否为null就可以了。

as 只会做一次类型检查加一次判断null值,判断null值要比类型检查容易的多。

在大多数场景中 ,as都可以替代is。

  

  

上一篇:《CLR via C#》书籍


下一篇:CLRCore(CLR核心机制)