上一主题下一主题
关键字
主题 : C#中is操作符与as操作符的区别是什么?
lzl
级别: 北风技术菜鸟

UID: 469020
精华: 0
发帖: 500
威望: 2058 点
学点: 1426 点
贡献: 45 点
好评: 0 点
学币: 0 个
注册时间: 2014-06-16
最后登录: 2015-03-31
楼主  发表于: 2014-11-13 22:40||

C#中is操作符与as操作符的区别是什么?

C#中is操作符与as操作符的区别是什么?
此帖悬赏结束
最佳答案: 2 学点
最佳答案获得者: lzhl
级别: 北风资深工程师

UID: 469019
精华: 0
发帖: 1455
威望: 2282 点
学点: 4207 点
贡献: 84 点
好评: 0 点
学币: 101 个
注册时间: 2014-06-16
最后登录: 2015-03-31
沙发(1楼)  发表于: 2014-11-13 22:42||

CLR实际会检查两次对象的类型,IS操作符首先检测变量的引用是否兼容于指定的类型,如果返回TRUE,则CLR在进行强制类型转换行进行第二次类型的检测,即studentObj对象是否引用一个Student类型。 2y;J 11\  
Wf>P[6  
由于强制类型转换CLR必须首先判断变更引用对象的实际类型,然后CLR必须去遍历继承层次结构,用变量引用类型的每个基类型去核对目标类型。这肯定会对性能造成一定的影响。好在C#****了AS操作符来弥补这一缺陷。
最佳答案奖励: (+2) 学点
级别: 北风技术菜鸟

UID: 469026
精华: 0
发帖: 517
威望: 1226 点
学点: 1062 点
贡献: 22 点
好评: 0 点
学币: 0 个
注册时间: 2014-06-16
最后登录: 2015-03-31
板凳(2楼)  发表于: 2014-11-13 22:41||

实际系统****发中,这是一个相当常用的编程模式,于是C#有了操作符as。 'c7'iDM  
v[Mh[CyB  
as与is****差不多的事情,类型显式强制转换。 %LM2CgH V  
as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是null。 t.rlC5 k  
"xI70c{  
R|m!*B~  
但as有其不同的地方,简化代码,同时提升性能。 F ,;B  
;W 3#q:  
请看示例代码: /wi*OZ7R  
2%?Kc]JY9  
Object obj=new Object(); "F[e~S#V*  
d[F3"b%  
ClassA a= obj  as ClassA; ~XeWN^l(Ov  
<` V_H~Z  
if(a!=null)  //在if判断a是否为null u5.zckV  
M!`&Z9N  
{ 2^X<n{0N)  
f8?hEa:js  
... o$p] p9  
,Mr_F^|  
} RRb>]oD  
%ONU0xtqk  
在这一段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用; )%JjV(:  
@ N@ !Q  
如果obj不兼容ClassA类型,as操作符会返回null。 'u#c_m! 9  
%$<v:eMAs  
因此,as操作符使CLR只检验一次对象的类型。 N0pA ,&  
g_3Ozy  
if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。 P67*-Ki  
bXz*g`=;  
所以正确****法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。 w5+(A_  
|;(>q  
示例代码: R('\i/fy  
ok1w4#%,  
Object obj=new Object(); //创建一个object对象. I.gF38Mx  
6T5\zInd  
ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null. P\y ZcL  
mhMTn*9  
a.ToString();//访问a会抛出一个NullReferenceException异常。
热心助人奖励: (+1) 学点
级别: 北风技术菜鸟

UID: 469022
精华: 0
发帖: 782
威望: 2155 点
学点: 1789 点
贡献: 39 点
好评: 0 点
学币: 1 个
注册时间: 2014-06-16
最后登录: 2015-03-31
地板(3楼)  发表于: 2014-11-13 22:42||

c# is和as的区别 ^TAf+C^Ry  
关于类型的判断和转换有is和as这2个操作符。具体区别和用法如下 _aw49ag;  
is就是处于对类型的判断。返回true和false。如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。另外is操作符永远不会抛出异常。代码如下:  5 c1{[  
U)D}J_Zi(  
System.Boolean b1 = (o is System.Object);//b1 为true 2Jqr"|sw  
System.Boolean b2 = (o is Employee);//b2为false如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型,就像下面代码一样 b\C1qM4  
if(o is Employee) { EB8<!c ?  
   Employee e = (Employee) o; %Ktlez:S  
   //在if语句中使用e 1  Lz  
}在上面代码中,其实clr对对象类型检查了两次:is操作首先检查o所引用的对象是否和employee类型兼容。如果兼容,那么在if语句内clr在执行转换时又会检查o是否为一个Employee引用。这种编程范式十分常见,c#便****了一种新的类型检查,转换方式。即as操作符,他可以在简化代码的同时,提高性能。代码如下: |qtZb}"|  
Employee e = o as Employee; Zi.w+V  
if(e != null) }kMKA.O"  
{ =HHb ]JE  
   //在if语句中使用e 6IKi*}  
}这种as操作即便等同于上面代码,同时只进行了1次的类型检查,所以提高了性能。如果类型相同就返回一个非空的引用,否则就返回一个空引用。