上一主题下一主题
关键字
主题 : 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类型。 <:p&P  
E-/]UH3u H  
由于强制类型转换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。 i>F=XE  
kWzN {]v  
as与is****差不多的事情,类型显式强制转换。 P\jGyS j  
as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是null。 1 R5 pf  
-JMn?]  
%**f`L%jN  
但as有其不同的地方,简化代码,同时提升性能。 H9cPtP~a)  
"j^i6RS   
请看示例代码: C?<pD+]b_  
ZitM<Qi&y  
Object obj=new Object(); G7%bY  
3A7774n=P  
ClassA a= obj  as ClassA; ScPVjqG2{  
I.<c{4K5  
if(a!=null)  //在if判断a是否为null 4DA34m(  
Luq4q95]  
{ /(N/DMl[  
COrk ( V  
... Zj`WRH4  
(f# (B2j  
} [0H0%z#tU&  
8Lo#{`  
在这一段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用; FcDS*ZEk!  
fr@F7s5}  
如果obj不兼容ClassA类型,as操作符会返回null。 X\|!  
$<}c[Nm  
因此,as操作符使CLR只检验一次对象的类型。 6  63o  
#+ I'V\ [  
if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。 n<I{x^!   
RZ".?  
所以正确****法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。 {1W:@6tl  
:GHv3hn5  
示例代码: tK#R`AQ  
Rj8%% G-pt  
Object obj=new Object(); //创建一个object对象. 9Em#Ela  
K2   
ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null. ~wc :/UM|  
a?c&#Jl  
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的区别 PEhLzZX+  
关于类型的判断和转换有is和as这2个操作符。具体区别和用法如下 } +Z;zm@/6  
is就是处于对类型的判断。返回true和false。如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。另外is操作符永远不会抛出异常。代码如下: Ykq }9  
K`2DhJC  
System.Boolean b1 = (o is System.Object);//b1 为true ozwqK oE  
System.Boolean b2 = (o is Employee);//b2为false如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型,就像下面代码一样 /'+JP4mK  
if(o is Employee) { `G{t<7[[;  
   Employee e = (Employee) o; Li$k<AM  
   //在if语句中使用e } /FM#Xh  
}在上面代码中,其实clr对对象类型检查了两次:is操作首先检查o所引用的对象是否和employee类型兼容。如果兼容,那么在if语句内clr在执行转换时又会检查o是否为一个Employee引用。这种编程范式十分常见,c#便****了一种新的类型检查,转换方式。即as操作符,他可以在简化代码的同时,提高性能。代码如下: W]]2Uo.  
Employee e = o as Employee; WL]'lSHa  
if(e != null) zOp"n\  
{ v65r@)\`  
   //在if语句中使用e `N,Jiw;bw  
}这种as操作即便等同于上面代码,同时只进行了1次的类型检查,所以提高了性能。如果类型相同就返回一个非空的引用,否则就返回一个空引用。