c# is和as的区别
关于类型的判断和转换有is和as这2个操作符。具体区别和用法如下
is就是处于对类型的判断。返回true和false。如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。另外is操作符永远不会抛出异常。代码如下:
System.Boolean b1 = (o is System.Object);//b1 为true
System.Boolean b2 = (o is Employee);//b2为false如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型,就像下面代码一样
if(o is Employee) {
Employee e = (Employee) o;
//在if语句中使用e
}在上面代码中,其实clr对对象类型检查了两次:is操作首先检查o所引用的对象是否和employee类型兼容。如果兼容,那么在if语句内clr在执行转换时又会检查o是否为一个Employee引用。这种编程范式十分常见,c#便提供了一种新的类型检查,转换方式。即as操作符,他可以在简化代码的同时,提高性能。代码如下:
Employee e = o as Employee;
if(e != null)
{
//在if语句中使用e
}这种as操作即便等同于上面代码,同时只进行了1次的类型检查,所以提高了性能。如果类型相同就返回一个非空的引用,否则就返回一个空引用。
参考:《.net框架程序设计》
1、as
用于在兼容的引用类型之间执行转换,as 运算符类似于强制转换操作;但是,如果转换不可行,as 会返回 null
而不是引发异常。更严格地说,这种形式的表达式:expression as type,等效于expression is type ?
(type)expression : (type)null,只是 expression 只被计算一次。注意,as
运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用 cast 表达式来执行
as操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功。
效率:
当用as操作符进行类型转换的时候,首先判断当前对象的类型, 当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,
而且为了保护转换成功,要加上try-catch. 而且并不产生新的对象【当不成功的时候,会返回null】。
相对来说,as效率高点,用as进行类型转换是安全的。 实例: e.Item.DataItem as DataRowView 同等
(DataRowView)e.Item.DataItem
2、is
检查对象是否与给定类型兼容,例如:if(obj is
string){}。如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是
true。如果已知表达式将始终是 true 或始终是 false,则 is 关键字将导致编译时警告,但是,通常在运行时才计算类型兼容性。不能重载
is 运算符。请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。