c#中的类型转换

摘自.net本质论

开发人员经常需要将一个对象从一种类型转换成另一种类型。CLR允许将一个对象转换为他的类型或者他的任何基类型。在C#中,向基类型的转换被认为是一种安全的隐式转换。但是,将对象转换为他的某个派生类型时,只能进行显示转换。

使用is和as操作符来转型

is检查一个对象是否兼容于指定的类型,返回一个bool值,永远不会抛出异常。如果对象引用是null,is操作符总是返回false,因为没有可以检查其类型的对象。

例如:定义一个类A:

Object o=new Object();

if(o is A){

   A a=(A)0;

......

}

CLR实际会检查两次对象的类型。首先检查O是否兼容于A类型。如果true,在内部执行转型时,CLR会再次核实O是否引用一个A。这种类型检查增加了安全性,但是性能较低,因为CLR首先必须判断变量(0)引用的对象的实际类型,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型。

as操作符

A a=o as A;

if(a!=null){

...

}

这时候,CLR核实o是否兼容于A类型,如果是,as会返回对同一个对象的一个非null引用。如果o不兼容于A类型,as会返回null,as操作符造成CLR只检验一次对象的类型,if只是检查是否为null。as操作符与强制类型转换一样,只是永远不会抛出一个异常,如若对象不能转型,结果就是null。故正确做法就是检查最终生成的引用是否为null。如果想直接使用最终生成的引用,会抛出一个System.NullReferencrException异常。

posted @ 2017-02-19 15:34  Zy宇  阅读(105)  评论(0)    收藏  举报