C#基础知识---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,因为没有可检查的其类型的对象。
if(obj is ClassA)
{
ClassA a=(ClassA) obj;
...
}
在这段代码中,CLR实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型,如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。CLR的类型检查增强了安全性,但也会对性能造成一定的影响。
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只检验一次对象的类型。
当as操作符返回null的时候,如果不进行判断直接调用,则会抛出NullReferenceException异常。
示例代码:
Object obj=new Object(); //创建一个object对象.
ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null.
a.ToString();//访问a会抛出一个NullReferenceException异常。
二、例子
- 1 public class Calculator
- 2 {
- 3 public int Add(int a, int b)
- 4 {
- 5
- 6 int result = a + b;
- 7 Console.WriteLine("Base: " + result);
- 8 return result;
- 9
- 10 }
- 11 }
- 12 public class CalculatorSub : Calculator
- 13 {
- 14 public new int Add(int a, int b)
- 15 {
- 16 int result = 2 * a + b;
- 17 Console.WriteLine("Sub: " + result);
- 18 return result;
- 19
- 20 }
- 21 }
- 22 class Program
- 23 {
- 24 static void Main(string[] args)
- 25 {
- 26
- 27 Object obj1 = new Object();
- 28 CalculatorSub calSub = new CalculatorSub();
- 29
- 30 Calculator calBase = new Calculator();
- 31
- 32 bool a = calBase is CalculatorSub;
- 33 if(a)
- 34 {
- 35 ( (CalculatorSub)calBase ).Add(2, 3);
- 36 }
- 37 var b = calBase as CalculatorSub;
- 38 if(b != null)
- 39 {
- 40 b.Add(2, 3);
- 41 }
- 42 bool c = calSub is Calculator;
- 43 if (c)
- 44 {
- 45 ((Calculator)calSub).Add(2, 3);
- 46 }
- 47 var d = calSub as Calculator;
- 48 if(d != null)
- 49 {
- 50 d.Add(2, 3);
- 51 }
- 52 (calSub as Calculator)?.Add(2, 3);//如果calSub as Calculator为null,则不会调用Add方法
- 53
- 54 Console.ReadKey();
- 55 }
- 56
- 57 }
C#基础知识---is与as的更多相关文章
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- APP测试入门篇之APP基础知识(001)
前言 最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...
随机推荐
- C语言:赋值语句
赋值语句 1.赋值号:= 2.赋值号具有方向性,只能将右边的常数 变量的值 表达式的值赋值给左边的变量 3.赋值号左边只能是变量,不能是表达式.常数.符号常量.常量 如下列是非法的语句:a+b=3; ...
- Java基础00-集合基础15
1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 代码示例: 想通过指定索引添加到最后一个位置的话就填写,现有索引的+1,比如3个索引就是4.如果在指定索引的位置添加没有 ...
- CentOS 7安装Python3 笔记
当前系统为阿里云的CentOS7.3 64位操作系统. 为了能让后续安装的软件(django,uwsgi,nginx等)尽量减少出现bug的几率,先把可能的依赖包都安装上. 一.安装依赖包 yum - ...
- P5042 丢失的题面
P5042 丢失的题面 顺序:10 - 1 - 7 - 8 - 9 - 4 - 5 - 6 - 2 - 3 Point 10 读入,特判,输出. 读入的英文意思是让选手输出自己的程序本身,这个题的确存 ...
- 扩展中国剩余定理(exCRT)
我 tm--CRT 没看懂 exCRT 却看懂了--emmmm-- 而且这名字完全就是国内的 OI 带师胡起的吧-- 考虑一次同余方程组 \[\begin{cases} x \equiv a_1\ ( ...
- Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)
影响范围 Liferay Portal 6.1.X Liferay Portal 6.2.X Liferay Portal 7.0.X Liferay Portal 7.1.X Liferay Por ...
- 记录21.08.04 — mybatis入门学习
mybatis入门 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工 ...
- OpenGL学习笔记(四)纹理
目录 要完成的纹理效果 纹理环绕方式 纹理过滤 多级渐远纹理 加载与创建纹理 stb_image库的使用方法 生成纹理对象 应用纹理 纹理单元 参考资料:OpenGL中文翻译 要完成的纹理效果 纹理是 ...
- Java互联网架构师系统进阶课程学习 (3)【享学】
3.原子操作CAS Atom(不可分割) 什么是原子操作?如何实现原子操作? syn基于阻塞的锁的机制,1.被阻塞的线程优先级很高,2.拿到锁的线程一直不释放锁怎么办?3.大量的竞争,消耗cpu,同时 ...
- MarkDown语法(Typora软件为例)
Hello !我又来了 这篇文章主要给大家讲一下MarkDown的一些基础语法,MarkDown语法是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML( ...