信息

2012-10-23 29 views
6

如果我有两个班,AB其中B从A派生:信息

class A {} 
class B : A { } 

我可以上溯造型相当愉快的B一个实例A

B b = new B(); 
A a = b; 

现在,我可以理解运行时可以如何确定所述底层类型是B,作为ECMA-335(公共语言基础结构(CLI)分区I至VI)的第132页指出

对象的实例化类型应携带充足的信息,以便在运行时恢复其确切类型(包括它们的泛型参数的类型和数量) 。 [理由:这是需要正确 -实例测试,以及在反射实现铸造和 能力

那么,如何在运行时知道,虽然背后的类型是B它实际上是存储在一个A。我知道一个事实,即我看不到B上提供的方法,但如果底层类型为B,它如何存储存储位置类型A

这有道理吗?

回答

7

的目的是一种B,和CLI知道它是一个B.它知道A中的东西是主要的编译器,其然后声明字段本地为类型A的(或者,在一些例如方法链接的情况下,该类型通过方法的返回类型而知道,该方法在IL的呼叫者的中被强加戳记)。所以基本上:调用代码本身就是“我认为这是一个A”。作业等通常都可以事先验证,所以没有错误的风险。如果您试图破解IL以故意错误,那么运行时会告诉您并拒绝运行该方法。由于这些原因,将一个已知的B值赋值给A local/field不需要任何类型检查 - 它只是一个直接分配。

+0

干杯马克,这是解释它。 –

3

对象的实际类型始终与对象本身一起存储在堆上。指向该对象的引用可以是不同的类型,只要该类型可以从实际类型(例如,基类或该类型的已实现的接口)分配即可。

堆上的每个对象都有少量的数据存储 - 该对象的类型就是其中的一种。