加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

有关内存中Caste C#引用类型的信息

发布时间:2020-12-15 04:24:42 所属栏目:百科 来源:网络整理
导读:如果我有两个类,A和B,其中B派生自A: class A {}class B : A { } 我可以非常高兴地将B的实例转换为A. B b = new B();A a = b; 现在,我可以理解运行时如何确定底层类型是B,如ECMA-335(公共语言基础结构(CLI)分区I到VI)的第132页所述 Objects of instantiated
如果我有两个类,A和B,其中B派生自A:
class A {}
class B : A { }

我可以非常高兴地将B的实例转换为A.

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

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

Objects of instantiated types shall carry sufficient information to
recover at runtime their exact type (including the types and number of
their generic arguments). [Rationale: This is required to correctly
implement casting and instance-of testing,as well as in reflection
capabilities

那么,运行时如何知道虽然底层类型是B,但它实际上存储在A中.我知道我不会看到B上可用的方法,但如果底层类型是B,那么它存储存储位置A的类型?

那有意义吗?

解决方法

对象是B,CLI知道它是B.知道A的东西主要是编译器,然后将字段或local声明为A类(或者在某些情况下类似于方法链接,类型)通过该方法的返回类型已知,该方法被刻印到调用者的IL中.所以基本上:调用代码本身就是“我认为这是一个A”.作业等通常都是事先可以验证的,所以不存在弄错的风险.如果你试图破解IL故意弄错,运行时会告诉你并拒绝运行该方法.由于这些原因,将已知的B值分配给A本地/字段不需要任何类型检查 – 它只是一个直接分配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读