类型安全应该算是CLR最重要的特性之一了,在运行时,CLR总是知道一个对象的类型。在C#中可以调用GetType()来返回调用对象的类型,并且由于GetType()继承于System.Object对象,并且为非虚的方法,所以一个类型不可能通过重写此方法而伪装成另一种类型。

由于在开发的过程中,经常会需要将一个对象从一种类型转换为其他的类型,所以CLR允许将一个对象强制转换成它本身所引用的类型或派生其的基类型。一个对象向其父类的转换CLR认为是一种安全的隐式转换,不需要任何特殊的然而需要将一个对象转换为其派生类型时,则需要进行显示的转换,因为这样的转换可能在运行时失败。

下面来看一个例子:

Code
Code

 

由上面代码可知,当强制转换Object类型对象时,编辑器并不知道变量引用的对象是什么类型,所以可以顺利的通过编辑,但是在运行时,CLR知道Obj保存的对象类型为Program,即不是Student 的基类型也不是Student 的派生类型,所以在运行时,此强制类型转换将抛出上述异常。因此,尽可能的在开发过程中操持代码类型的安全,由编辑器生成一个编译时错误,而避免在运行时才看到异常。

posted on 2008-10-08 21:41  .Net Learning  阅读(4149)  评论(0编辑  收藏  举报