Dotnet中用接口描述is和as操作符之间的区别
来源:互联网 发布:软件 研究方法 编辑:程序博客网 时间:2024/06/08 02:57
我们在实际工作中可能需要知道对象是否支持接口,从而可以调用相应的方法,而Dotnet中有is和as操作符可以满足我们判断的要求,下面我们通过接口来比较一下Dotnet中is和as的区别
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 //关键字isinst是is的MSIL代码,测试能否转换
IL_0028: brfalse.s IL _0039
IL_
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_
IL_002b: brfalse.s IL _0034
IL_0030: ldloc.2
这样我们一看转换只进行了一次,效率高了吧
那么这个时候我们就很清楚的就知道什么时候该用is,什么时该用as了:如果我们测试对象的目的是确定它是否属于所需类型,并且若是的话就要立即转换,这种情况下as操作符效率更好,但有时我们只是测试并不想立即转换,可能根本就不会转换,只是在对象实现了接口时,要将它加到一个列表中,这是is操作符就是一个更好的选择。
- Dotnet中用接口描述is和as操作符之间的区别
- is 和 as 的区别
- as 和 is的区别
- IS和AS的区别
- is和as的区别
- C#中的is和as操作符区别
- is 和 as 操作符
- is和as操作符
- is和as操作符
- is和as操作符
- AS3 中的is与as操作符的区别
- 解析C#中is和as操作符的用法
- 解析C#中is和as操作符的用法
- 解析C#中is和as操作符的用法
- 解析C#中is和as操作符的用法
- 解析C#中is和as操作符的用法
- 2016-3-28--C#的is和as操作符
- is 和 as 运算符的作用与区别 c#
- Java 2源码解读1:java.util.ArrayList (版本:2.0)
- 数据结构中关键路径算法的实现与应用
- 一、无法打开Web项目
- [转载] 图灵奖中的数学家
- 关于一个SqlServer的存储过程问题.
- Dotnet中用接口描述is和as操作符之间的区别
- 孙子兵法
- oracle初始化参数设置
- C库函数手册
- CVS 命令集
- 鼠标经过链接时,文字提示显示在页面的右下角,不会阻碍浏览者的视线
- struts1.1中的异常应用实践
- 一、无法打开ASP.NET Web项目
- struts框架中多行表单提交