.Net常识之 浅析as和is操作符

  [email protected]
#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  ------------------------------------+
[email protected]

  

你可能感兴趣的:(.Net常识之 浅析as和is操作符)