A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐宏伟 中级黑马   /  2012-9-1 20:43  /  3469 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C Sharp中is运算符和as运算符的区别?麻烦详细点……谢谢

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
李 玉林 来自手机 中级黑马 2012-9-1 21:15:01
沙发
is是做了判断  是指一个类型是否可以转换成另一个类型  返回的是一个布尔值    而as虽然也是把一个类型转换成另一个类型 但是如果可以转换则转换成as后面的类型 否则返回一个空值

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
以下文章来自博客园。希望楼主在发帖的时候百度一下,或者google一下。
Is:检查对象是否与给定的类型兼容。例如,下面的代码可以确定MyObject类型的一个实例,或者对象是否从MyObject派生的一个类型:

   1:  if(obj is MyObject)   2:  {}如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。

如果已知表达式始终是true或始终是false,则is关键字将导致编译时警告,但是通常在运行时才计算类型兼容性。

注意:is运行符不能重载,is运行符只考虑引用转换、装箱转换和取消装箱转换。不考虑其它转换,如果用户定义转换。

在Is运算符的左侧不允许使用匿名方法。lambda表达式属于例外。
如果对象引用是null,is运算符总是返回false,因为没有可检查其类型的对象。
is运算符通常像下面这样使用:
if (myObject is Employee) {       Employee myEmployee = (Employee)myObject; }
在这段代码中,CLR实际会检查两次对象的类型。is运算符首先核实myObject是否兼容于Employee类型。如果是,那么在if语句内部执行转换型,CLR会再次核实myObject是否引用一个Employee。CLR的类型检查增加了安全性,但这样对性能造成一定影响。这是因为CLR首先必须判断变量(myObject)引用的对象的实际类型。然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以C#专门提供了as运算符,目的就是简化这种代码写法,同时提升性能。

as:用于检查在兼容的引用类型之间执行某些类型的转换。

示例:

Employee myEmployee = myObject as Employee;if (myEmployee != null){ }




在这段代码中,CLR核实myObject是否兼容于Employee类型;如果是,as会返回对同一个对象的一个非null的引用。如果myObject不兼容于Employee类型,as运算符会返回null。

注意:as运算符造成CLR只校验一次对象的类型。if语句只是检查myEmployee是否为null。这个检查的速度比校验对象的类型快得多。

as运算符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常。相反,如果对象不能转换,结果就是null。所以,正确的做法是检查最终生成的一引用是否为null。如果企图直接使用最终生成的引用,会抛出一个System.NullReferenceException异常。以下代码对此进行了演示:

Object o = new Object();        //新建一个Object对象。Employee e = o as Employee;     //将o转型为一个Employee  //上述转型操作会失败,不会抛出异常,但e会被设为null e.ToString();   //访问e会抛出一个NullReferenceException异常备注:

as运算符类似于强制转换操作。但是无法进行转换,则as返回null而非引发异常。

示例:

expression as Type它等效于以下表达式,但是只计算一次expression。
expression is Type ?(Type)expression : (Type)null注意:as运算符只执行引用转换和装箱转换。as运算符无法执行其它转换,如果用户定义的转换,这类转换应使用强制转换表达式来执行。






示例:

Object myObject = new Object();   Boolean b1 = (myObject is Object);      //b1=true.    Boolean b2 = (myObject is Employee);    //b2=false.

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
Is运算符用于检查对象的运行时类型是否与给定类型兼容,
as 运算符用于执行可兼容类型之间的转换

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马