中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > 临时文章
Dotnet中用接口描述is和as操作符之间的区别
作者:未知 时间:2004-12-17 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无


                我们在实际工作中可能需要知道对象是否支持接口,从而可以调用相应的方法,而
Dotnet中有isas操作符可以满足我们判断的要求,下面我们通过接口来比较一下Dotnetisas的区别

is操作符的形式为:表达式is类型。Is操作符在表达式(必须是引用类型)可以安全的转换为类型,而不抛出异常时,结果为true。下面我们通过一个例子来看一看is的用法:

//只在安全时转换,假设Document类仅仅实现IStorable接口,而没有实现//ICompressible接口,并且接口IStorable 中有 Read(),Write()等方法

Document doc =new Document(“test   Document”);

If(Document is IStorable)   //is在此测试是否合法

{

 IStorable isDoc=(IStorable) doc; //强制转换,因为Document类仅仅实现IStorable接口,所以转换合法

 isDoc.Read();

}

//下面的转换就不合法

Document doc =new Document(“test   Document”);

If(Document is ICompressible)   //is在此测试是否合法

{

 ICompressible isDoc=(ICompressible) doc; //强制转换,因为Document类没有实现ICompressible接口,所以转换不合法

 isDoc.Read();

}

If告诉我们,只有对象是正确的接口类型时才进行强制转换。这样就导致了is的效率不佳,为什么呢?让我们来看一段下面的MSIL代码:

IL_0023   isinst         ICompressible   //关键字isinstisMSIL代码,测试能否转换

IL_0028   brfalse.s       IL _0039

IL_002a   ldloc.0

IL_002b   castclass      ICompressible  //这里又要进行测试,先测试,后转换

IL_0030   ldloc.2

      ………………

所以两次的测试导致效率不佳,这时我们来看一看as操作符并且对它们进行比较。

As操作符的形式是:表达式as 类型

As 操作符将is操作符和转换操作结合起来,首先测试转换是否合法(即is测试是否转换为true),如是就进行转换。如转换不合法(即is测试是否转换为false),as操作符返回null,我们来看一下例子:

Document doc =new Document(“test   Document”);

IStorable isDoc= doc  as  IStorable;

If(isDoc !=null)  

isDoc.Read();

else

Console.WriteLine(“IStorable  not  support”)

通理:

Document doc =new Document(“test   Document”);

ICompressible isDoc= doc  as  ICompressible;

If(isDoc !=null)  

isDoc.Read();

else

Console.WriteLine(“ICompressible  not  support”)

我们再来看一下MSIL代码:

IL_0023   isinst         ICompressible  

IL_0028   stloc.2

IL_002a   ldloc.2

IL_002b   brfalse.s       IL _0034

IL_0030   ldloc.2

这样我们一看转换只进行了一次,效率高了吧

那么这个时候我们就很清楚的就知道什么时候该用is,什么时该用as了:如果我们测试对象的目的是确定它是否属于所需类型,并且若是的话就要立即转换,这种情况下as操作符效率更好,但有时我们只是测试并不想立即转换,可能根本就不会转换,只是在对象实现了接口时,要将它加到一个列表中,这是is操作符就是一个更好的选择。

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有