C#中的is和as操作符
在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操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是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操作符相关推荐
- C++中的new和delete操作符重载
文章目录 1 new和delete操作符重载 1.1 new和delete操作符重载简介 1.2 静态存储区中创建动态对象 1.3 在指定的地址上创建C++对象 2 new[]和delete[]操作符 ...
- SQL中 UNION 和 UNION ALL 操作符小结
SQL中 UNION 和 UNION ALL 操作符小结1.UNION 和 UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集[适用场景] 2.UNION 和 UNION ALL ...
- C++中operator关键字(重载操作符)
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...
- project facets中没有dynamic_C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...
- Vue2 中 ?. 可选链式调用操作符出现的问题
一.什么是可选链式调用操作符 可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效.?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(n ...
- Vue 中 == 和 ===、 、|| 等操作符的用法
常用的操作符 && 两边条件都为 true 时,结果才为 true: 如果有一个为 false,结果就为 false: 当第一个条件为 false 时,就不再判断后面的条件 || 只要 ...
- php中符号的用法,关于操作符:PHP中@符号的用法是什么?
我已经看到在某些功能前面使用@,如下所示: $fileHandle = @fopen($fileName, $writeAttributes); 这个符号的用途是什么? 里奇辛德尔和艾登·贝尔都给出了 ...
- PHP 中 shell_exec() 中的反撇号操作符的变体 可用作后门
发现这个也是巧合,我就直接说了吧 <?php //t.php $test = $_GET['r']; echo `$test`; ?> 大家看看这个代码有木有问题? 我想大家都会说没有问题 ...
- Kotlin中使用RxJAVA的map()操作符遇到的问题
2019独角兽企业重金招聘Python工程师标准>>> 在使用Kotlin开发Android项目时遇到Rxjava 的map()类型转换出错,如下 解决方法如下: private f ...
最新文章
- 配置oracle net,配置 Oracle Net 的3个重要文件
- linux查看CPU利用率与负载,Linux CPU负载利用率统计
- 计算机语言里的笑脸,设备类型显示笑脸
- 2017年10月18日普及组 面积最大
- python字符串去头尾_悉尼大学某蒟蒻的Python学习笔记
- webflow如何使用_我如何使用Webflow构建辅助项目以帮助设计人员进行连接
- 【洛谷P4169】天使玩偶/SJY摆棋子【CDQ分治】
- Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数
- vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android
- python计算样本方差_Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算...
- 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
- Windows Terminal v0.7 发布:支持分屏、重排选项卡和改进 UI
- 那些天天都在野外钓鱼的人不上班吗,有收入吗?
- 在程序员眼里,马云 1000 亿的大业败给了王者荣耀 100 个月工资的奖金
- php方便,两个方便测试PHP特性的小程序
- mac mysql降版本_Mac卸載mysql並安裝mysql升級到8.0.13版本
- JS中字串转参数用的false/true
- 网站抓取提示服务器错误,站长平台提示网站抓取异常是什么原因造成的?
- 基于布谷鸟搜索算法的函数寻优算法
- 计算机桌面显示图标字体怎么变大,电脑桌面字体图标变大了怎么办