1、Is和As的区别:
使用is操作符,is
检查对象是否兼容于指定类型,返回 Boolean
值 true
或 false
。注意, is
操作符永远不抛出异常。如果对象引用 null
,is
操作符总是返回 false
,因为没有可检查其类型的对象。
if (o is Employee){
Employee e = (Employee) o;
// 在 if 语句剩余的部分中使用 e
}
CLR 实际检查两次对象类型。 is
操作符首先核实 o
是否兼容于 Employee
类型。如果是,在 if
语句内部转型时, CLR 的类型检查增强了安全性,但无疑会对性能造成一定影响。这是因为 CLR 首先必须判断变量(o
)引用的对象的实际类型。然后, CLR 必须遍历继承层次结构,用每个基类型去核对指定的类型(Employee
)。由于这是一个相当常用的编程模式,所以 C# 专门提供了 as
操作符,目的就是简化这种代码的写法 ,同时提升其性能。
Employee e = o as Employee;
if (e != null) {
// 在 if 语句中使用 e
}
在这段代码中,CLR 核实 o
是否兼容于 Employee
类型;如果是, as
返回对同一个对象的非 null
引用。如果 o
不兼容于 Employee
类型, as
返回 null
。注意, as
操作符造成 CLR 只校验一次对象类型。if
语句只检查 e
是否为 null
;这个检查的速度比校验对象的类型快得多。
as
操作符的工作方式与强制类型转换一样,只是它永远不抛出异常——相反,如果对象不能转型,结果就是null
。 所以,正确做法是检查最终生成的引用是否为 null
。企图直接使用最终生成的引用会抛出 System.NullReferenceException
异常。