查看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的更多相关文章

  1. IL查看泛型

    查看泛型的IL 我们在开发中经常用到泛型,下面一起通过IL来查看泛型背后做了那些工作 示例代码 示例代码如下: using System;   namespace MyCollection { pub ...

  2. IL查看委托

    查看委托的IL 通过IL来查看委托的原理, 委托示例代码 写一个委托的类如下 using System;   namespace MyCollection { //定义一个类,该类包含两个静态方法 c ...

  3. IL接口和类的属性

    上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...

  4. 30分钟?不需要,轻松读懂IL

    先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理由就是一个 ...

  5. 读懂IL

    读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...

  6. 轻松读懂IL

    轻松读懂IL先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的 ...

  7. [No0000152]C#基础之IL,轻松读懂IL

    先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.其实IL本身逻辑很清 ...

  8. (转) 读懂IL

    引言 转自园子里的一片关于IL的好文,分享的同时,方便自己今后查阅. 原文链接:http://www.cnblogs.com/brookshi/p/5225801.html ------ 略过作者调侃 ...

  9. C#基础之IL ,轻松读懂中间代码IL 转载

    [No0000152]C#基础之IL,轻松读懂IL   先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.n ...

随机推荐

  1. [原创]html5_PC游戏_图片俄罗斯方块

    PC游戏_图片俄罗斯方块 以前的了,快一年了... 使用了离线canvas复制的方法,启动预览效果需要服务器支持 另外,AC娘图片可以自己做加载功能,这样游戏图片显示更顺畅 效果: --- 代码: h ...

  2. Javascript的一种代码结构方式——插件式

    上几周一直在做公司的webos的前端代码的重构,之中对javascript的代码进行了重构(之前的代码耦合严重.拓展.修改起来比较困难),这里总结一下当中使用的一种代码结构——插件式(听起来怎么像独孤 ...

  3. 使用CodeMirror在浏览器中实现编辑器的代码高亮效果

    使用CodeMirror在浏览器中实现编辑器的代码高亮效果 在网站后台管理中希望能够对网站的样式表css与js文件以及模板html进行管理,在编辑的时候只是以普通文本展示又太普通,显得好难看,于是便在 ...

  4. SharePoint 2010 类似人人网站内信功能实施

    简介:用SharePoint代码加实施的方式,完成类似人人网站内信功能,当然,实现的比较简单,样式也比较难看,只为给大家一个实施的简单思路,如有谬误,还请见谅.当然,还有就是截图比较长,当然为了让大家 ...

  5. 读取XML绑定TreeNode

    <asp:TreeView ID="treeview" OnClick="TreeViewCheckBox_Click()" runat="se ...

  6. R语言学习笔记:日期处理

    1.取出当前日期 Sys.Date() [1] "2014-10-29" date()  #注意:这种方法返回的是字符串类型 [1] "Wed Oct 29 20:36: ...

  7. 在Seismic.NET下用最少的语句写出一个剖面显示程序

    用Seismic.NET开发地震剖面显示程序可以节省大量的时间,下面的代码展开了如何用最少的代码显示一个SEGY文件. // 用一行语句把 reader, pipeline, view 和 plot ...

  8. android Android-PullToRefresh 下拉刷新

    1.github下载地址 原作者:  https://github.com/chrisbanes/Android-PullToRefresh 我自己的:  https://github.com/zyj ...

  9. android项目中gen目录不能自动生成R.java的原因

    1.调用的资源文件不存在:xml文件中有些控件没有关联引用:把项目缺少的文件加上,包括资源文件,如 values中的strings.xml或者图片等资源. 2.项目中缺少必须的系统文件(比如:defa ...

  10. linux 查看系统版本

    博客分类: linux LinuxRedHatDebianSuSE  几种查看linux版本信息的方法: uname -a cat /proc/version cat /etc/issue lsb_r ...