博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CLR-sos调试】关于方法表继承调用问题的总结
阅读量:6376 次
发布时间:2019-06-23

本文共 1841 字,大约阅读时间需要 6 分钟。

CLR调用方法的机制到底是什么样子的?子类方法表的构成?这篇文章以我的实际经历加以总结,给出问题的答案。

首先,问题的引入,如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 方法表构成CLR调用测试 {
public class Father {
public void DoWork() {
Console.WriteLine("Father.DoWork()"); } public virtual void DoVirtualWork() { Console.WriteLine("Father.DoVirtualWork()"); } public virtual void DoVirtualWork2() {
Console.WriteLine("Father.DoVirtualWork2()"); } } public class Son : Father {
public new void DoWork() { Console.WriteLine("Son.DoWork()"); } public override void DoVirtualWork() { Console.WriteLine("Son.DoVirtualWork()"); } public new void DoVirtualWork2() {
Console.WriteLine("Son.DoVirtualWork2()"); } } class Program {
static void Main(string[] args) {
//下面的输出是什么 Father son2 = new Son(); son2.DoWork(); son2.DoVirtualWork(); son2.DoVirtualWork2(); } } }

输出是什么呢?如果你是大牛,对这个问题很明了,那么你没有必要往下看了,到这里请停住,以免浪费了您的宝贵时间,我会觉的惭愧的。 - -。如果你对CLR,IL,SOS调试等一无所知,那么您也大可以抽出您的宝贵时间看点别的,- -!。博友心声:废话一大堆,赶快进入正题!DebugLZQ:马上!

让我们先看下问题的输出:

 咦,这个结果!!!!!

可能,你认为DebugLZQ的这篇文章,完全是无理取闹,你没事搞这玩意做甚?这里提醒各位,这里要谈论的话题可是深入理解面相对象的三大支柱不可或缺的啊,至少我们使用的.NET Framework类库,无处不存在着继承,重写,覆盖。。。

之前,对CLR有过相关的研究,下面直接给出问题的正确答案!(DebugLZQ的错误认识就不与各位博友分享了,以免误导各位,适得其反。)

从CLR调用的机制着手解答:

首先每个类型(Father、Son)都有自己的方法表,CLR在调用一个方法时,已经知道这个方法是不是虚方法。如果不是虚方法,那么就去检查变量类型的method table,因此son2.DoWork()查找的是Father的MT(如果找不到那么会去基类里找),找到了就执行它(或者先JIT再执行)。如果是虚方法,那么会根据引用找到堆上的那个对象,根据对象的type pointer找到对象的真正类型(即GetType方法的返回类型),因此son2.DoVirtualWork()会直接查找Son的MT(如果找不到那么就去基类,这跟非虚方法是相同的)。

关于子类方法表构成:包含父类的虚方法,不包含父类的实例方法。

关于SOS调试:请参考msdn的总结:。

 

转载地址:http://patqa.baihongyu.com/

你可能感兴趣的文章
浅谈物化视图
查看>>
安装SQL Server 2017
查看>>
超融合超越企业传统存储绕不开的六个问题
查看>>
医院CIO的一幅工作对联
查看>>
DPM灾难切换应用场景
查看>>
简单配置Oracle10g DataGuard物理备库
查看>>
网曝支付宝漏洞:手机丢了,支付宝也就完了
查看>>
4 在vCenter Server安装View Composer组件
查看>>
SFB 项目经验-24-为持久聊天室-查询或者增加成员
查看>>
Linux下配置Squid基础教程
查看>>
当Cacti遭遇大流量
查看>>
Outlook Anywhere 客户端配置详解
查看>>
《Windows Server 2008 R2系统管理实战》前言与内容提要
查看>>
轻巧的网络流量实时监控工具NTOPNG
查看>>
Access、Sql 获取当前插入的主键ID
查看>>
聚类算法之DBScan(Java实现)
查看>>
为什么要使用AOP?
查看>>
VC :模板类
查看>>
对C++中string类型的总结
查看>>
Oracle发布公共云Public Cloud
查看>>