C# 中的as和is小结

    在读.Net 框架设计的时候,关于C#中类型转化中的部分内容,在此总结记录,分享予大家。

首先,我们声明一个简单的继承关系。

Class Father
{
   Int 32 x;
}

Class Child:Father
{
  Int32 y;
}

下面哪些类型转化是可行的,哪些是CTE(编译时错误),哪些是RTE(运行时错误)?

编号              语句                                                      OK                      CTE                     RTE                     
1 Father f1=new Child();    
2 Child c1=new Father();    
3 Child c2=f1;    
4 Child c3=(Child)f1;    
5 Object o1=new Object();    
6 Child c4=(Child)o1;    

   

    C#不需要特殊的语法就能把一个对象转化为其基类型。这是因为从派生对象向基类转化的过程是安全可靠的。所以,CLR允许编号1这样的语法,但是绝对不允许编号2这样的语法。因为从派生对象往基类转化是不安全的。所以当我们想要把基类对象转化为派生类对象的时候,必须显式的进行强制转化,像编号4这样。注意:在某些情况下,这种显式的转化会出现RTE,即使它们逃过了编译器的“法眼”,如编号6所示。

    为什么编号6会出现CTR,这是因为Object o1和类Child是“不兼容的”。

    什么是“兼容”呢?C#中关键字 is 就是用来判断是否兼容的。

   

Father f5=new Father();
Father f6=new Child();
Child c5=new Child();

Bool b0=f5 is Father;//b0=true;
Bool b1
=f5 is Child;//b1=false; Bool b2=c5 is Father;//b2=true; Bool b3=f6 is Child;//b3=true;

 Bool b=“对象引用” is “类型”。如果“对象引用” 所指对象是 “类型” 的一个实例、或者“对象引用”所指的对象是 “类型” 的派生类一个实例对象,则说明是兼容的。
 

    我们举个《.net框架》上的例子,

    Object o=new Object();
//此处使用is要做两次类型判断

    if(o is Employee)
    {
       Employee e=(Employee)o;
    }
//c此处使用as只需做一次类型判断
Employee e=o as Employee;
if(NULL!=e)
{
//使用e
}

  

  实际,as所做的就是——如果类型是兼容的,那么就把e执行o所指向的对象。再如下例:

Int32 x = 15;
object o = x as Object;
 if (o != null)
  {
     Console.WriteLine(o.GetType().FullName.ToString());//System.Int32
  }

    抛砖引玉,更多的东西读者自己去品味吧。

原文地址:https://www.cnblogs.com/zzPrince/p/3397047.html