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

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

         

       

  • 相关阅读:
    从零开始学架构(三)UML建模
    【网址收藏】博客园主题美化
    完美解决国内访问GitHub速度太慢的难题
    SpringBoot+slf4j线程池全链路调用日志跟踪 二
    SpringBoot+slf4j实现全链路调用日志跟踪 一
    2021年java最全面试宝典【核心知识整理】
    [中级]系统集成项目管理工程师历年真题及参考答案
    线程池ThreadPoolExecutor最全实战案例
    大厂git分支管理规范:gitflow规范指南
    IdentityServer4
  • 原文地址:https://www.cnblogs.com/shouhongxiao/p/3173827.html
Copyright © 2011-2022 走看看