IS2120@CSDN.BG57IV3 #region R#.1 @.net中的隐式、显式转换以及as、is操作符 //z 2012-07-16 14:22:19 @IS2120.T2169364049[T1,L65,R1,V259] 1. System.Object 在.net中,每一个对象最终都会派生自System.Object类型,这意味着下面两种类型定义事实上是一样的: class IS2120{ ... } 和 class IS2120:System.Object{ ... } 既然每个对象最终都会自System.Object派生而来,那么可以保证任一类型的任一个对象都有一个最基本的功 能集。 2. 功能集 Equals 判断两个Object是否具有同样的值 GetHashCode 对于对象的值返回一个哈希值 GetType 返回一个Type-Derived对象,表明当前对象的类型 ToString 默认,返回类型名。 3. new 操作符 为创建对象从托管堆中分配空间。并且初始化对象本身数据之外的开销数据成员的值。 每个对象都有一些额外的字节,这些字节被clr用来管理对象,比如说object的虚表指针以及一个指向sync block的引用。 IS2120 i = new IS2120("cnblogs"); new 没有与之对应的诸如delete这样的操作符。在.net (1.0) 中不能显式地释放或是销毁一个对象。 .net 提供了gc,用于自动检测不再使用的对象并将之释放。 4. 数据类型之间的转换 4.1 派生类能向基类隐式转换 数据类型之间相关转换的规则 System.Object o = new IS2120("cnblogs"); 这能够顺利的编译和执行,因为进行了一个隐式转换。new操作符返回一个IS2120类型的引用,然后隐式转换 为了System.Object类型了。所有从System.Object派生的类型都能转换为System.Object。(派生类能够向基 类隐式转换) 编译器没有提供(不支持)从基类向派生类的转化 IS2120 i = o; 编译时(vs2008)会出现这样的错误: Error 1 Cannot implicitly convert type 'object' to 'Test.ImplictedCast.IS2120'. An explicit conversion exists (are you missing a cast?) 加上这样的形式就能够正确编译了 IS2120 i = (IS2120)o; 这样是使用了一个显示的转换。 另一个例子 System.Object o = new System.Object(); IS2120 i = (IS2120)o; 能够正常编译,但是执行的时候会抛出一个异常InvalidCastExceptions was unhandled. Unable to cast object of type 'System.Object' to type 'Test.ImplictedCast.IS2120'. c#的CLR在执行第二句的时候会校验由o所引用的对象是否是一个IS2120类型或是IS2120的派生类型。如是,则 允许转换。否则就会抛出异常。 5. as 操作符,执行转换的另一种方式。 IS2120 i = new IS2120(); System.Object o = i as System.Object; 试图将一个对象转换为指定类型。不像一般的转换,as操作符不会抛出异常。 如果转换没有成功执行,结果将为null。 System.Object o = new System.Object(); IS2120 i = o as IS2120; i.ToString(); // 由于i为null,那么执行这个会抛出 NullReferenceException 。 Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. 6. is 操作符 检查一个object与一个类型是否兼容,并返回评估的结果。该操作符也不抛出异常。 System.Object o = new System.Object(); System.Boolean b1 = (o is System.Object); //True System.Boolean b2 = (o is IS2120); // False 如果对象引用为null,总是返回 false 。 7. 练习 class B{ int x; } class D:B{ int x; } es : execute successfully ce : compiler error re : common language runtime error 7.1 System.Object o1 = new System.Object(); 7.2 System.Object o2 = new B(); 7.3 System.Object o3 = new D(); 7.4 System.Object o4=o3; 7.5 B b1 = new B(); 7.6 B b2 = new D(); 7.7 D d1 = new D(); 7.8 B b3 = new System.Object(); 7.9 D d3 = new System.Object(); 7.10 B b3 = d1; 7.11 D d2 = b2; 7.12 d4 = (D)d1; 7.13 d5 = (D)b2; 7.14 d6 = (D)b1; 7.15 b4 = (B)o1; 7.16 b5 = (D)b2; #endregion //z 2012-07-16 13:15:51 @IS2120.T31932526 ------------------------------------+ IS2120@CSDN.BG57IV3