C# 中的as和is小结_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# 中的as和is小结

C# 中的as和is小结

 2013/10/30 17:12:52  wzStyle  博客园  我要评论(0)
  • 摘要:在读.Net框架设计的时候,关于C#中类型转化中的部分内容,在此总结记录,分享予大家。首先,我们声明一个简单的继承关系。ClassFather{Int32x;}ClassChild:Father{Int32y;}下面哪些类型转化是可行的,哪些是CTE(编译时错误),哪些是RTE(运行时错误)?编号语句OKCTERTE1Fatherf1=newChild();√2Childc1=newFather();√3Childc2=f1;√4Childc3=(Child
  • 标签:C#

    在读.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
  }

 

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

发表评论
用户名: 匿名