一、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. C语言:带参数的宏与函数的区别

    带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算:宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存.而函数是一段可以重复使用的代码,会被编译,会给它 ...

  2. python得到当前版本号

    import sys print(sys.winver) 3.7 # 导入sys模块的argv,winver成员,并为其指定别名v.wv from sys import argv as v, winv ...

  3. python + pytest 基本使用方法(Fixture)

    #firtures通常用来对测试方法.测试函数.测试类和整个测试文件进行初始化或还原测试环境# setup_module/teardown_module:在当前文件中,在所有测试用例执行之前与之后执行 ...

  4. Linux + .net core 开发升讯威在线客服系统:首个经过实际验证的高性能版本

    业余时间用 .net core 写了一个在线客服系统.并在博客园写了一个系列的文章,写介绍这个开发过程: .net core 和 WPF 开发升讯威在线客服系统:目录 https://blog.she ...

  5. 【NOIP2007】Hanoi双塔问题

    题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...

  6. javascript学习五---OOP

    面向对象:JavaScript的所有数据都可以看成对象 JavaScript的面向对象编程和大多数其他语言如Java.C#的面向对象编程都不太一样.如果你熟悉Java或C#,很好,你一定明白面向对象的 ...

  7. mysql中的with rollup得到group by的汇总信息

    使用mysql中的with rollup可以得到每个分组的汇总级别的数据: 表如下: CREATE TABLE `test3` (  `id` int(5) unsigned NOT NULL AUT ...

  8. JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504)

    检测漏洞 工具 下载地址:https://github.com/joaomatosf/JavaDeserH2HC javac -cp .:commons-collections-3.2.1.jar E ...

  9. 大数据学习(14)—— HBase进阶

    HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...

  10. vulnhub-DC:6靶机渗透记录

    准备工作 在vulnhub官网下载DC:6靶机DC: 6 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收集 利用nmap ...