IL查看override
查看override的IL
Override示例
下面我们看一个Override的Example
namespace MyCollection
{
public class MyBase
{
public virtual string Meth1()
{
return "MyBase-Meth1";
}
public virtual string Meth2()
{
return "MyBase-Meth2";
}
public virtual string Meth3()
{
return "MyBase-Meth3";
}
}
class MyDerived : MyBase
{
// 使用 override 关键字重写虚方法 Meth1:
public override string Meth1()
{
return "MyDerived-Meth1";
}
// 使用 new 关键字显式隐藏
// 虚方法 Meth2:
public new string Meth2()
{
return "MyDerived-Meth2";
}
// 由于下面声明中没有指定任何关键字
// 因此将发出一个警告来提醒程序员
// 此方法隐藏了继承的成员 MyBase.Meth3():
public string Meth3()
{
return "MyDerived-Meth3";
}
}
public class VirtualExample
{
public static void Main()
{
MyDerived mD = new MyDerived();
MyBase mB = (MyBase)mD;
System.Console.WriteLine(mD.Meth1());
System.Console.WriteLine(mD.Meth2());
System.Console.WriteLine(mD.Meth3());
System.Console.WriteLine("以上为类MyDerived的显示结果!\n");
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
System.Console.WriteLine("以上为MyBase的显示结果!\n");
System.Console.WriteLine("按任意键退出...");
System.Console.ReadLine();
}
}
}
运行结果

IL查看
双击查看Main方法

IL代码
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 121 (0x79)
.maxstack 1
.locals init ([0] class MyCollection.MyDerived mD,
[1] class MyCollection.MyBase mB)
IL_0000: nop
IL_0001: newobj instance void MyCollection.MyDerived::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: callvirt instance string MyCollection.MyBase::Meth1()//调用的是MyBase的Meth1()
IL_000f: call void [mscorlib]System.Console::WriteLine(string)
IL_0014: nop
IL_0015: ldloc.0
IL_0016: callvirt instance string MyCollection.MyDerived::Meth2()
IL_001b: call void [mscorlib]System.Console::WriteLine(string)
IL_0020: nop
IL_0021: ldloc.0
IL_0022: callvirt instance string MyCollection.MyDerived::Meth3()
IL_0027: call void [mscorlib]System.Console::WriteLine(string)
IL_002c: nop
IL_002d: ldstr bytearray (E5 4E 0A 4E 3A 4E 7B 7C 4D 00 79 00 44 00 65 00 // .N.N:N{|M.y.D.e.
72 00 69 00 76 00 65 00 64 00 84 76 3E 66 3A 79 // r.i.v.e.d..v>f:y
D3 7E 9C 67 01 FF 0A 00 ) // .~.g....
IL_0032: call void [mscorlib]System.Console::WriteLine(string)
IL_0037: nop
IL_0038: ldloc.1
IL_0039: callvirt instance string MyCollection.MyBase::Meth1()//这里一样调用的是MyBase的Meth1()
IL_003e: call void [mscorlib]System.Console::WriteLine(string)
IL_0043: nop
IL_0044: ldloc.1
IL_0045: callvirt instance string MyCollection.MyBase::Meth2()
IL_004a: call void [mscorlib]System.Console::WriteLine(string)
IL_004f: nop
IL_0050: ldloc.1
IL_0051: callvirt instance string MyCollection.MyBase::Meth3()
IL_0056: call void [mscorlib]System.Console::WriteLine(string)
IL_005b: nop
IL_005c: ldstr bytearray (E5 4E 0A 4E 3A 4E 4D 00 79 00 42 00 61 00 73 00 // .N.N:NM.y.B.a.s.
65 00 84 76 3E 66 3A 79 D3 7E 9C 67 01 FF 0A 00 ) // e..v>f:y.~.g....
IL_0061: call void [mscorlib]System.Console::WriteLine(string)
IL_0066: nop
IL_0067: ldstr bytearray (09 63 FB 4E 0F 61 2E 95 00 90 FA 51 2E 00 2E 00 // .c.N.a.....Q....
2E 00 ) // ..
IL_006c: call void [mscorlib]System.Console::WriteLine(string)
IL_0071: nop
IL_0072: call string [mscorlib]System.Console::ReadLine()
IL_0077: pop
IL_0078: ret
} // end of method VirtualExample::Main
IL解析
我们先回头看看源程序处的main内部的“System.Console.WriteLine(mD.Meth1());”语句对应上面的 IL_000a: callvirt instance string MyCollection.MyBase::Meth1() 和 IL_0039: callvirt instance string MyCollection.MyBase::Meth1()处的一模一样,原来它执行的是MyBase类的Meth1虚方法。而Meth1方法已经在 MyDerived类中重写了,所以这两个类的对应的方法1在本质说上都一样了。
通过看这个例子,我们能更加深入地理解override的功能了。看来ILdasm的确厉害,与其你想半天不如调IL代码看看,很多问题就会迎刃而解了,拨云见日啊!
文献资料
对于IL代码指令的具体含义请参考:http://www.cnblogs.com/zery/p/3366175.html
IL查看override的更多相关文章
- IL查看泛型
查看泛型的IL 我们在开发中经常用到泛型,下面一起通过IL来查看泛型背后做了那些工作 示例代码 示例代码如下: using System; namespace MyCollection { pub ...
- IL查看委托
查看委托的IL 通过IL来查看委托的原理, 委托示例代码 写一个委托的类如下 using System; namespace MyCollection { //定义一个类,该类包含两个静态方法 c ...
- IL接口和类的属性
上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...
- 30分钟?不需要,轻松读懂IL
先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理由就是一个 ...
- 读懂IL
读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...
- 轻松读懂IL
轻松读懂IL先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的 ...
- [No0000152]C#基础之IL,轻松读懂IL
先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.其实IL本身逻辑很清 ...
- (转) 读懂IL
引言 转自园子里的一片关于IL的好文,分享的同时,方便自己今后查阅. 原文链接:http://www.cnblogs.com/brookshi/p/5225801.html ------ 略过作者调侃 ...
- C#基础之IL ,轻松读懂中间代码IL 转载
[No0000152]C#基础之IL,轻松读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.n ...
随机推荐
- 微软Asp.net MVC5生命周期流程图
.NET WEB Development blog 发布了Asp.net MVC5生命周期文档, 这个文档类似Asp.net应用程序生命周期,您以前开发ASP.NET WEB应用程序应该 ...
- python3.5.2爬虫
话不多说,都在代码里 #下载斗鱼颜值栏目主播照片 #author:ives #date:2016-8-28 21:58 #e-mail:renhanlinbsl@163.com import urll ...
- [Architecture Pattern] Repository实作查询功能
[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...
- javascript --- 设计模式之单体模式(二)
在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法: var her = { property1: 'someing', ...
- C#实现图标批量下载
本文略微有些长,花了好几晚时间编辑修改,若在措辞排版上有问题,请谅解.本文共分为四篇,下面是主要内容,也是软件开发基本流程. 阶段 描述 需求分析 主要描述实现本程序的目的及对需求进行分析,即为什么要 ...
- Android主线程不能访问网络异常解决办法
从两个方面说下这个问题: 1. 不让访问网络的原因 2. 解决该问题的办法 不让访问网络的原因: 由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会 ...
- 二叉查找树(binary search tree)详解
二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...
- iOS阅读器实践系列(一)coretext纯文本排版基础
前言:之前做了公司阅读类的App,最近有时间来写一下阅读部分的实现过程,供梳理逻辑,计划会写一个系列希望能涉及到尽量多的方面与细节,欢迎大家交流.吐槽.拍砖,共同进步. 阅读的排版用的是coretex ...
- 【原】xcode5&IOS7及以下版本免证书真机调试记录
搞了有一段IOS开发了,之前一直在企业做,近阶段主要在公司做C++服务端开发,打算在空闲实现搞搞个人开发,为自己赚钱,IDP还没申请下来,所以先用此方法在越狱设备上先做一下app的免证书真机调试,先记 ...
- Android源码分析之Looper
先来说说summary,Looper就是用来在某个线程中跑一个message loop.一个线程默认是没有message loop与之相关联的, 为了创建一个你必须在这个线程中调用Looper.pre ...