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异常。
我们要的不是解决Bug,而是拒绝Bug

浙公网安备 33010602011771号