Jam*_*man 6 c# memory polymorphism clr casting
如果我有两个类,A并且BB派生自A:
class A {}
class B : A { }
Run Code Online (Sandbox Code Playgroud)
我可以上溯造型很愉快的一个实例B来A.
B b = new B();
A a = b;
Run Code Online (Sandbox Code Playgroud)
现在,我可以理解运行时如何确定底层类型是B,如ECMA-335(公共语言基础结构(CLI)分区I到VI)的第132页所述
实例化类型的对象应携带足够的信息,以便在运行时恢复其确切类型(包括其通用参数的类型和数量).[基本原理:这是正确实现测试和测试实例以及反射功能所必需的
那么,运行时如何知道虽然底层类型B实际上存储在一个A.我知道一个事实,我不会看到可用的方法B,但如果基础类型是B,它如何存储存储位置的类型A?
那有意义吗?
对象是B,CLI知道它是B.知道A的东西主要是编译器,然后将字段或local声明为A类(或者在某些情况下类似于方法链接,类型)通过该方法的返回类型已知,该方法被刻印到调用者的 IL中.所以基本上:调用代码本身就是"我认为这是一个A".作业等通常都是事先可以验证的,所以不存在弄错的风险.如果你试图破解IL故意弄错,运行时会告诉你并拒绝运行该方法.由于这些原因,将已知的B值分配给A本地/字段不需要任何类型检查 - 它只是一个直接分配.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |