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 }