zoukankan      html  css  js  c++  java
  • 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
      }

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

  • 相关阅读:
    Codeforces Round #534 Div. 1
    Codeforces Round #540 Div. 3 F2
    Educational Codeforces Round 60 Div. 2
    Luogu4389 付公主的背包(生成函数+多项式exp)
    BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
    Codeforces Round #539 Div. 1
    js --- 关于DOM的事件操作
    js函数
    js常用内置对象
    js数据类型转换 ----流程控制
  • 原文地址:https://www.cnblogs.com/zzPrince/p/3397047.html
Copyright © 2011-2022 走看看