c# is & as

做为C#里的类型转换操作符,is和as都是强制类型转换。

Difference

  • is 类型检查,检查一个对象是否兼容于制定类型,并且返回一个布尔值。如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。is操作符永远不会抛出异常
  • as 安全的显示类型转换,仅支持引用类型不支持值类型。永远不会抛出异常,如果转换失败返回null。简化代码,提升性能。

Example

ClassA{
  ...
}
//is 操作符使用:

Object obj = new Object(); 
Boolean b = obj is ClassA; 

if(b)
{
    ClassA a = (ClassA) obj;
    ... 
}

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

//as 操作符使用:
Object obj=new Object(); 
ClassA a= obj as ClassA;

if(a!=null) 
{
  ...
}

在上诉代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用。如果obj不兼容ClassA类型,as操作符会返回null。

因此,as操作符使CLR只检验一次对象的类型。
if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。

Summary

用is操作符时需要先判断为true再去转换,而as直接强制转换,简化代码,同时提高性能。

故而类型转换时优先选用as,当只需要判断true/false然后进行不同逻辑操作时采用is

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,933评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • ECMAScript关键字 delete do else finally function in instance...
    doudou2阅读 726评论 0 0
  • 今天是元宵节,王蛋蛋出生53天,王蛋蛋已经有一天没有拉臭臭了,虽然奶奶说这是已经聚肚了,没问题,但是妈妈还是有点担...
    王蛋蛋的日常阅读 150评论 0 0
  • 额,要睡之前想要写日记来着,可是熄灯了,按摸摸的只能换球衣睡觉了,教大家一个️按模模怎么换衣服不会穿反的办法,摸一...
    千叶千阅读 218评论 0 1