.net 类型转换

    在.net  平台下类型有两种方式可以进行类型转换,强转或as转换。(有的说法是两种方式都进行强转,有两种强转方式)。

    如:typeA objA = (typeA)objB 或者使用另一种typeA objA = objB as objA  这二种有什么不同,先说第二种as 的方法。

   首先as只能用于引用类型不能用于值类型。而且是为类型安全,不会抛出错。就是不成功也会你一个NUll。CLR在检查objB 是否与objA有继承关系。如果有就指向一个指针。否则返回NUll.而强转 由于强制类型转换CLR必须首先判断变更引用对象的实际类型,然后CLR必须去遍历继承层次结构,用变量引用类型的每个基类型去核对目标类型,如不成功会在运行时(上面例子)抛出异常,所以好多时候在做强转的时候用is判断就是个这原因,根据MSDN上的解释,它的作用是“检查对象是否与给定类型兼容。实际上它是做一次转换练习。

     通过上面,我们可以得出一个这样的结论:as是一种安全的转换,而强转是一种不安全转换(最起码的用is做一次判断)可它可支持值类型。(我找了好久也找不到关于值类型与引用类型在转换时的区别,引用类型可以理解,那值类型是如何实现类型转换的,难道是装箱操作?)

     强转不会在编译出错,只会出错在运行阶段。因为它不能动态分析你的类型内部具体细节看以下例子 D是B的子类(以下例子来自.net formwork4)

    1 Object o1 = new Object();

    2 Object o2 = new B();

    3  Object o3= new D();

    4  Object o4 =o3;

    5  B b1 = new B();

    6  B b2 = new D();

    7  d d1= new D();

    8 B b3 = new Object();

    9 D d3 = new Object();

    10 B b4 =d1;

    11 D d2 =b2;

  12 D d4= (D)d1;

    13 D d5= (D)b2;

    14 D d6= (D)b1;

    15 D b5= (B)O1;

     16 B b6= (D)b2;

       8,9,11 会在编译时就出错。14,15在运行时出错。这点网上书都有说的,可这么多方法如何理解。

  Object 是所有类型的基类。B是父类。如是出现一个显示或试图把一个范围小的类型指针(也就是父类)指向(赋值)一个更大范围的指针(子类型)就会编译错,这很明显你的内存指针范围越界了。(你小子还不够力量,还想让我指向你) 14,15实际也是这样问题,可它们理论上是没问题的,D指向D B指向B (所以编译不会出错),运行时发现问题了,因为犯了与上面一样错。

  你新建的一个对象不会丢(new D) 虽然B指向的,(实际B也仅指向了自己那部分)可占用内存是已经存在的了.所以再次指向,是完全没有问题的 16。

  面象对象的更多理解,如果从内存模型上考虑一切问题会变得很简单.

     

   

posted @ 2013-07-05 15:49  一点点水  阅读(834)  评论(0编辑  收藏  举报