一、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的更多相关文章

  1. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  2. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  5. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  6. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  7. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  8. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  10. APP测试入门篇之APP基础知识(001)

    前言        最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...

随机推荐

  1. 家庭账本开发day11

    编写登录界面和个人信息查看界面 $.ajax({                    url: "UserServlet?method=login",//url          ...

  2. 高校表白App-团队冲刺第十天

    今天要做什么 做一个类似于淘宝的小云播报 做了什么 没有完全实现,轮转实现,功能没有 遇到的问题 遇到的问题好多啊,感觉写一天都写不完,我还是好好学习一下再重新写吧

  3. 前端开发入门到进阶第三集【Jsonp】

    /* $.ajax({ type : "get", url : "${loginInfo.SSO_BASE_URL }/user/token/" + token ...

  4. java内存模型——重排序

    线程安全问题概括来说表现为三个方面:原子性,可见性和有序性. 在多核处理器的环境下:编译器可能改变两个操作的先后顺序:处理器可能不是完全依照程序的目标代码所指定的顺序执行命令:一个处理器执行的多个操作 ...

  5. 微信小程序对接显示阿里云数据库数据

    现实需求 在项目中需求,有时候现场设备发生故障,需要远程的人员知道.除了邮件方式,以微信小程序的方式也很好.今天进行尝试,并制作了一个demo版本. 1.微信小程序申请制作前端 1.1lists文件( ...

  6. 移动APP我们需要关注什么

    移动APP关注的点比web或者PC上的程序更多 1.测试用例的设计 移动互联网的快节奏,要放弃传统的测试用例编写方式,不需要写详细的测试用例,采用罗列测试点的方式如思维导图,这样既节省时间又能够直观清 ...

  7. 开发者如何快速搭建自己的电商App?

    面向电商购物场景,HMS Core提供了创新的电商解决方案,帮助应用快速获客.提升转化率,实现业务增长.为了帮助开发者了解如何在电商购物类应用中集成HMS Core的各项能力,HMS Core开发了电 ...

  8. window.location.href下载文件,文件名中文乱码处理

    下载文件方法: window.location.href='http://www.baidu.com/down/downFile.txt?name=资源文件'; 这种情况下载时:文件名资源文件会中文乱 ...

  9. Python爬虫+可视化教学:爬取分析宠物猫咪交易数据

    前言 各位,七夕快到了,想好要送什么礼物了吗? 昨天有朋友私信我,问我能用Python分析下网上小猫咪的数据,是想要送一只给女朋友,当做礼物. Python从零基础入门到实战系统教程.源码.视频 网上 ...

  10. 记录21.07.26 —— Vue/cil

    VUE搭载脚手架 搭载环境 下载node node.js下载地址 控制台输入 npm install -g @vue/cil 查看版本 创建vue项目 创建完后会显示启动服务的指令 这个指令可以在pa ...