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     }
View Code

 

posted on 2018-09-19 16:44  缘惜  阅读(292)  评论(0编辑  收藏  举报