c# 中 is和as 操作符是用来进行强制类型转换的

is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常

 object o = new object();  
 if (o is Label)  
 {       
    Label lb = (Label)o;       
    Response.Write("类型转换成功"); 
 }  
 else 
 {      
     Response.Write("类型转换失败");  
 } 

在上面的代码,CLR实际上会检查两次对象的类型,is操作符先核实一次,如果o兼容于Lable,那么在(Label)o时会再次核实一次,效率比较低,不建议使用

as:与强制类型转换是一样的,但是永远不会抛出异常,即如果转换不成功,会返回null

  object o = new object(); 
  Label lb = o as Label;    
  if (lb == null)   
  {       
   Response.Write("类型转换失败");  
  }   
  else  
  {   
   Response.Write("类型转换成功");
  } 

在上面的代码中,CLR只会进行一次类型核实,效率要高于 is

在学习C#时,看到这样一种表达方式:

 BAP_USER user = session["User"] as BAP_USER; 
 if(user == null)     
 return mapping.FindForward("error"); 

有些不明白,上网查了些资料,对is和as操作符有了些了解,把资料放在这里供学习和参考:

在C#中,所有的东西都是对象。因此任何常数也是一个整型对象。这里用到了as ,as 是C#语言里面的一个关键字。as 运算符类似于类型转换,所不同的是,当转换失败时,as 运算符将产生空,而不是引发异常。在形式上,这种形式的表达式:

expression as type 

as 运算符只执行引用转换和装箱转换。

as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用case表达式来代替其执行

关于is的其实也差不多,只是IS不会帮你进行任何的转换。所以需要自已进行显示转换

is操作符进行转换,它自动检查时局是否和类型兼容,并返回结果。而且它不会抛出异常。如果对象引用为null,则is总返回false。

if (cls1 is Class2)       
{
    Class2 cls2 = (Class2)cls1;   
}  
else  
{
    System.Console.WriteLine("Error 2!"); 
}

as操作符进行转换:

  Class2 cls2 = cls1 as Class2;
  if (cls2!=null)    
   System.Console.WriteLine("Ok"); 
  else     
   System.Console.WriteLine("Error!"); 

对比is和as操作符转换的两种方式,is需要做两次对象的类型检查,而as需要做一次对象类型检查,再加一次null的检查,而null检查开销比对象类型检查少。相对as的方法效率高些。

转载于:https://www.cnblogs.com/jhxk/articles/1738997.html

解析C#中is和as操作符的用法相关推荐

  1. 解析C#中is和as操作符的用法 two

    c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常  object o = new object();     ...

  2. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法

    Linux 中C语言getcwd()函数的用法 先来看该函数的声明: #include char *getcwd(char *buf,size_t size); 介绍: 参数说明:getcwd()会将 ...

  3. python集合类型的四种操作符_深入解析Python中的集合类型操作符

    (1)标准类型操作符(所有的集合类型) 成员关系 (in, not in) 就序列而言,Python中的in和not in操作符决定某个元素是否是一个集合中的成员. 集合等价/不等价 等价/不等价被用 ...

  4. C++中的指针特征操作符重载

    文章目录 1 C++中的指针特征操作符重载 1.1 指针特征操作符重载 1.2 使用指针特征操作符重载实现智能指针 1 C++中的指针特征操作符重载 1.1 指针特征操作符重载 指针特征操作符重载: ...

  5. java中的双冒号操作符

    java :: Java中的双冒号操作符 </h1><div class="clear"></div><div class="p ...

  6. 【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践

    深度解析C++中的POD类型:从理论基础到项目实践 1. C++中的POD类型(Plain Old Data) 1.1 POD类型的定义和特性 Trivial类型 Standard layout类型 ...

  7. 从多维度解析神经科学中的视觉编码

    来源:脑人言 一棵树是如何被知觉为"一棵树"?我又是如何认出你是"你"?我们可能会说这很大程度依赖于我们的视觉感知.以后者为例,从你身上反射的光将你的信息传入我 ...

  8. 2dx解析cocosbuilder中使用layer时的缺陷

    2dx解析cocosbuilder中使用layer时的缺陷 cocos2d-x 3.7 cocosbuilder中的layer通常会用到触摸属性: 但是在2dx解析布局文件的时候,却很多属性都没解析: ...

  9. 解析 WEB 中所有 URL 的简单牛B代码,先保存起来,方式将来找不到了

    解析 WEB 中所有 URL 的简单牛B代码,先保存起来,方式将来找不到了 2011-11-22 16:48        by        通用信息化建设平台,        1471       ...

最新文章

  1. CSS Modules
  2. Operation category READ is not supported in state standby
  3. 对比学习系列论文SimROD(二): A Simple Adaptation Method for Robust Object Detection
  4. 重学java基础第十八课:卸载jdk和安装jdk
  5. 漫步数学分析九——级数
  6. 库存管理软件挑选窍门:怎么才算合格的库存管理软件?
  7. mybatis代码生成器
  8. 使用Sigar采系统信息
  9. vba编写的出库单(可添加出库项目记录、生成、打印出库单)
  10. 通过注册表修改键盘映射
  11. 关于连接数据库出现时差问题的解决方法
  12. npm run build 报错: No such file or directory
  13. springboot 自定义starter
  14. 嵌入式linux kermit,嵌入式开发常用串口工具kermit使用笔记
  15. Generative Time Series Forecasting with Diffusion, Denoise, and Disentanglement
  16. 开发基于 Google Map 的 Android 应用
  17. 在计算机系统中存储容量最大的设备,计算机系统中存储容量最大的部件是().
  18. angularJS学习小结——filter
  19. 【Linux】冯诺依曼体系结构
  20. 51单片机中断与计时器

热门文章

  1. linux awk
  2. 太原锦华计算机学校教学质量怎样,一所好学校有哪些特点?
  3. xstatic图形连接linux,RHCE认证考试模拟题深入讲解:linux配置静态IP地址为:192.168.0.X!...
  4. 信息安全完全参考手册之信息安全概述(第一章)
  5. [小心][注意][请转发]请检查你环境中的SSD磁盘!
  6. 华为-公有云-云硬盘-磁盘类型及性能介绍
  7. Mysql学习总结(67)——MYSQL慢查询日志
  8. Docker学习总结(20)——Docker 容器实践精华问答集锦
  9. Java基础学习总结(41)——JPA常用注解
  10. html 滚动条处于页面底部,滚动条一直置于页面底部,开发聊天程序须知。