做为C#里的类型转换操作符,is和as都是强制类型转换。
Difference
- is 类型检查,检查一个对象是否兼容于制定类型,并且返回一个布尔值。如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。is操作符永远不会抛出异常
- as 安全的显示类型转换,仅支持引用类型不支持值类型。永远不会抛出异常,如果转换失败返回null。简化代码,提升性能。
Example
ClassA{
...
}
//is 操作符使用:
Object obj = new Object();
Boolean b = obj is ClassA;
if(b)
{
ClassA a = (ClassA) obj;
...
}
在上诉代码中,CLR(Common Language Runtime)实际会检查两次
对象类型。is操作符首先核实obj是否兼容于ClassA 类型。如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响。这是因为CLR首先必须判断(obj)引用的对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(ClassA)。
//as 操作符使用:
Object obj=new Object();
ClassA a= obj as ClassA;
if(a!=null)
{
...
}
在上诉代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用。如果obj不兼容ClassA类型,as操作符会返回null。
因此,as操作符使CLR只检验一次
对象的类型。
if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。
Summary
用is操作符时需要先判断为true再去转换,而as直接强制转换,简化代码,同时提高性能。
故而类型转换时优先选用as,当只需要判断true/false然后进行不同逻辑操作时采用is