zoukankan      html  css  js  c++  java
  • .net中的隐式、显式转换以及as、is操作符

      1 #region           R#.1      @.net中的隐式、显式转换以及as、is操作符
      2 //z 2012-07-16 14:22:19 @IS2120.T2169364049[T1,L65,R1,V259]
      3 1. System.Object 
      4 在.net中,每一个对象最终都会派生自System.Object类型,这意味着下面两种类型定义事实上是一样的:
      5 class IS2120{
      6 ...
      7 }
      8   9 class IS2120:System.Object{
     10 ...
     11 }
     12 既然每个对象最终都会自System.Object派生而来,那么可以保证任一类型的任一个对象都有一个最基本的功
     13 能集。
     14 
     15 2. 功能集
     16 Equals 判断两个Object是否具有同样的值
     17 GetHashCode 对于对象的值返回一个哈希值
     18 GetType 返回一个Type-Derived对象,表明当前对象的类型
     19 ToString 默认,返回类型名。
     20 
     21 3. new 操作符
     22 为创建对象从托管堆中分配空间。并且初始化对象本身数据之外的开销数据成员的值。
     23 每个对象都有一些额外的字节,这些字节被clr用来管理对象,比如说object的虚表指针以及一个指向sync
     24 block的引用。
     25 IS2120 i = new IS2120("cnblogs");
     26 
     27 new 没有与之对应的诸如delete这样的操作符。在.net (1.0) 中不能显式地释放或是销毁一个对象。
     28 .net 提供了gc,用于自动检测不再使用的对象并将之释放。
     29 
     30 4. 数据类型之间的转换
     31 4.1 派生类能向基类隐式转换
     32 数据类型之间相关转换的规则
     33 System.Object o = new IS2120("cnblogs");
     34 这能够顺利的编译和执行,因为进行了一个隐式转换。new操作符返回一个IS2120类型的引用,然后隐式转换
     35 为了System.Object类型了。所有从System.Object派生的类型都能转换为System.Object。(派生类能够向基
     36 类隐式转换)
     37 
     38 编译器没有提供(不支持)从基类向派生类的转化
     39 IS2120 i = o;
     40 编译时(vs2008)会出现这样的错误:
     41 Error    1    Cannot implicitly convert type 'object' to 'Test.ImplictedCast.IS2120'. 
     42 An explicit conversion exists (are you missing a cast?)
     43 
     44 加上这样的形式就能够正确编译了
     45 IS2120 i = (IS2120)o;
     46 这样是使用了一个显示的转换。
     47 
     48 另一个例子
     49 System.Object o = new System.Object();
     50 IS2120 i = (IS2120)o;
     51 能够正常编译,但是执行的时候会抛出一个异常InvalidCastExceptions was unhandled.
     52 Unable to cast object of type 'System.Object' to type 'Test.ImplictedCast.IS2120'.
     53 c#的CLR在执行第二句的时候会校验由o所引用的对象是否是一个IS2120类型或是IS2120的派生类型。如是,则
     54 允许转换。否则就会抛出异常。
     55 
     56 5. as 操作符,执行转换的另一种方式。
     57 IS2120 i = new IS2120();
     58 System.Object o = i as System.Object;
     59 试图将一个对象转换为指定类型。不像一般的转换,as操作符不会抛出异常。
     60 如果转换没有成功执行,结果将为null。
     61 System.Object o = new System.Object();
     62 IS2120 i = o as IS2120;
     63 
     64 i.ToString(); // 由于i为null,那么执行这个会抛出 NullReferenceException 。
     65 Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of 
     66 an object.
     67 
     68 6. is 操作符
     69 检查一个object与一个类型是否兼容,并返回评估的结果。该操作符也不抛出异常。
     70 System.Object o = new System.Object();
     71 System.Boolean b1 = (o is System.Object); //True
     72 System.Boolean b2 = (o is IS2120); // False
     73 如果对象引用为null,总是返回 false 74 
     75 7. 练习
     76 class B{
     77     int x;
     78 }
     79 
     80 class D:B{
     81     int x;    
     82 }
     83 es : execute successfully
     84 ce : compiler error
     85 re : common language runtime error
     86 
     87 7.1 System.Object o1 = new System.Object();
     88 7.2 System.Object o2 = new B();
     89 7.3 System.Object o3 = new D();
     90 7.4 System.Object o4=o3;
     91 7.5 B b1 = new B();
     92 7.6 B b2 = new D();
     93 7.7 D d1 = new D();
     94 7.8 B b3 = new System.Object();
     95 7.9 D d3 = new System.Object();
     96 7.10 B b3 = d1;
     97 7.11 D d2 = b2;
     98 7.12 d4 = (D)d1;
     99 7.13 d5 = (D)b2;
    100 7.14 d6 = (D)b1;
    101 7.15 b4 = (B)o1;
    102 7.16 b5 = (D)b2;
    103 #endregion        //z 2012-07-16 13:15:51 @IS2120.T31932526  ------------------------------------+
  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/IS2120/p/2593579.html
Copyright © 2011-2022 走看看