在C#语言中进行类型转换的操作符is和as。is和as都是强制类型转换,但这两者有什么相同之处和不同之处呢?在使用is和as需要注意哪些事项?下面我们从简单的代码示例去探讨这个简单的问题。注:此博文只是本人学习过程中一些简要记录,新手可以看一下,高手略过。

is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle。注意,is操作符永远不会抛出异常,请看以下示例:

ClassA

{

....

}

Object o=new Object();

Boolean b1=(o is Object); //b1为true.

Boolean b2=(o is ClassA) ; b2为false.

如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。

is 操作符通常像下面这样使用:

if(obj is ClassA)

{

ClassA a=(ClassA) obj;

...

}

在这一段代码中,CLR实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型。如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响。这是因为CLR首先必须判断(obj)引用的对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(ClassA)。

实际系统开发中,这是一个相当常用的编程模式,于是C#有了操作符as。

as与is做差不多的事情,类型显式强制转换。

as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是null。

但as有其不同的地方,简化代码,同时提升性能。

请看示例代码:

Object obj=new Object();

ClassA a= obj  as ClassA;

if(a!=null)  //在if判断a是否为null

{

...

}

在这一段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用;

如果obj不兼容ClassA类型,as操作符会返回null。

因此,as操作符使CLR只检验一次对象的类型。

if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。

所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。

示例代码:

Object obj=new Object(); //创建一个object对象.

ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null.

a.ToString();//访问a会抛出一个NullReferenceException异常。

转载于:https://www.cnblogs.com/BrokenIce/p/5822163.html

C#中的is和as操作符相关推荐

  1. C++中的new和delete操作符重载

    文章目录 1 new和delete操作符重载 1.1 new和delete操作符重载简介 1.2 静态存储区中创建动态对象 1.3 在指定的地址上创建C++对象 2 new[]和delete[]操作符 ...

  2. SQL中 UNION 和 UNION ALL 操作符小结

    SQL中 UNION 和 UNION ALL 操作符小结1.UNION 和 UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集[适用场景] 2.UNION 和 UNION ALL ...

  3. C++中operator关键字(重载操作符)

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  4. project facets中没有dynamic_C++强制类型转换操作符 dynamic_cast

    dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...

  5. Vue2 中 ?. 可选链式调用操作符出现的问题

    一.什么是可选链式调用操作符 可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效.?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(n ...

  6. Vue 中 == 和 ===、 、|| 等操作符的用法

    常用的操作符 && 两边条件都为 true 时,结果才为 true: 如果有一个为 false,结果就为 false: 当第一个条件为 false 时,就不再判断后面的条件 || 只要 ...

  7. php中符号的用法,关于操作符:PHP中@符号的用法是什么?

    我已经看到在某些功能前面使用@,如下所示: $fileHandle = @fopen($fileName, $writeAttributes); 这个符号的用途是什么? 里奇辛德尔和艾登·贝尔都给出了 ...

  8. PHP 中 shell_exec() 中的反撇号操作符的变体 可用作后门

    发现这个也是巧合,我就直接说了吧 <?php //t.php $test = $_GET['r']; echo `$test`; ?> 大家看看这个代码有木有问题? 我想大家都会说没有问题 ...

  9. Kotlin中使用RxJAVA的map()操作符遇到的问题

    2019独角兽企业重金招聘Python工程师标准>>> 在使用Kotlin开发Android项目时遇到Rxjava 的map()类型转换出错,如下 解决方法如下: private f ...

最新文章

  1. 配置oracle net,配置 Oracle Net 的3个重要文件
  2. linux查看CPU利用率与负载,Linux CPU负载利用率统计
  3. 计算机语言里的笑脸,设备类型显示笑脸
  4. 2017年10月18日普及组 面积最大
  5. python字符串去头尾_悉尼大学某蒟蒻的Python学习笔记
  6. webflow如何使用_我如何使用Webflow构建辅助项目以帮助设计人员进行连接
  7. 【洛谷P4169】天使玩偶/SJY摆棋子【CDQ分治】
  8. Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数
  9. vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android
  10. python计算样本方差_Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算...
  11. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
  12. Windows Terminal v0.7 发布:支持分屏、重排选项卡和改进 UI
  13. 那些天天都在野外钓鱼的人不上班吗,有收入吗?
  14. 在程序员眼里,马云 1000 亿的大业败给了王者荣耀 100 个月工资的奖金
  15. php方便,两个方便测试PHP特性的小程序
  16. mac mysql降版本_Mac卸載mysql並安裝mysql升級到8.0.13版本
  17. JS中字串转参数用的false/true
  18. 网站抓取提示服务器错误,站长平台提示网站抓取异常是什么原因造成的?
  19. 基于布谷鸟搜索算法的函数寻优算法
  20. 计算机桌面显示图标字体怎么变大,电脑桌面字体图标变大了怎么办

热门文章

  1. 丰润达全面完成安防传输生态体系布局
  2. javascript笔记——点击按钮(或超链接)如何跳转到另外一个页面并执行目标页面的js函数...
  3. IAR FOR ARM 各版本号,须要的大家能够收藏了
  4. 10条影响CSS渲染速度的写法与建议
  5. 用CSS控制表格的框格线
  6. Policy Injection Application Block
  7. 用扫描的方式实现Rosenfeld and Pfaltz提出的距离变换!
  8. shell中echo使用单引号时输出单引号
  9. JQuery实现Ajax功能
  10. leetcode算法题--会议室★★