首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于.NET 中间语言有关问题,高手请不要错过 ,比较长,需要细心才能看完

2012-03-24 
关于.NET 中间语言问题,高手请不要错过 ,比较长,需要细心才能看完主:本文的代码内码地址在:http://blog.vc

关于.NET 中间语言问题,高手请不要错过 ,比较长,需要细心才能看完
主:   本文的代码内码   地址在:http://blog.vckbase.com/zhaotide/archive/2004/11/06/1316.aspx
我在学习这篇文章的时候遇到了一个不解的地方,请高手帮忙,谢谢.
代码如下时:
    namespace   ConsoleApplication1
{
///   <summary>
///   Class1   的摘要说明。
///   </summary>
class   Class1
{
///   <summary>
///   应用程序的主入口点。
///   </summary>
[STAThread]
static   void   Main(string[]   args)
{
//
//   TODO:   在此处添加代码以启动应用程序
//
MyDerived   mD   =   new   MyDerived();

MyBase   mB   =   (MyBase)   mD;
//MyBase   mB   =   new   MyBase();


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();


}
}
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 ";

}
}


}
main中间语言为:
    .method   private   hidebysig   static   void     Main(string[]   args)   cil   managed
{
    .entrypoint
    .custom   instance   void   [mscorlib]System.STAThreadAttribute::.ctor()   =   (   01   00   00   00   )  
    //   Code   size               111   (0x6f)
    .maxstack     1
    .locals   init   ([0]   class   ConsoleApplication1.MyDerived   mD,
                      [1]   class   ConsoleApplication1.MyBase   mB)
    IL_0000:     newobj           instance   void   ConsoleApplication1.MyDerived::.ctor()


    IL_0005:     stloc.0
    IL_0006:     ldloc.0
    IL_0007:     stloc.1
    IL_0008:     ldloc.0
    IL_0009:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth1()
    IL_000e:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0013:     ldloc.0
    IL_0014:     callvirt       instance   string   ConsoleApplication1.MyDerived::Meth2()
    IL_0019:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_001e:     ldloc.0
    IL_001f:     callvirt       instance   string   ConsoleApplication1.MyDerived::Meth3()
    IL_0024:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0029:     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_002e:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0033:     ldloc.1
    IL_0034:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth1()
    IL_0039:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_003e:     ldloc.1
    IL_003f:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth2()
    IL_0044:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0049:     ldloc.1
    IL_004a:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth3()
    IL_004f:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0054:     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_0059:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_005e:     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_0063:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0068:     call               string   [mscorlib]System.Console::ReadLine()
    IL_006d:     pop
    IL_006e:     ret
}   //   end   of   method   Class1::Main
当源代码修改为:
MyBase   mB   =   (MyBase)   mD;
//MyBase   mB   =   new   MyBase();
换成
//   MyBase   mB   =   (MyBase)   mD;
MyBase   mB   =   new   MyBase();

中间代码   为:
.method   private   hidebysig   static   void     Main(string[]   args)   cil   managed
{
    .entrypoint
    .custom   instance   void   [mscorlib]System.STAThreadAttribute::.ctor()   =   (   01   00   00   00   )  
    //   Code   size               115   (0x73)
    .maxstack     1
    .locals   init   ([0]   class   ConsoleApplication1.MyDerived   mD,
                      [1]   class   ConsoleApplication1.MyBase   mB)
    IL_0000:     newobj           instance   void   ConsoleApplication1.MyDerived::.ctor()
    IL_0005:     stloc.0
    IL_0006:     newobj           instance   void   ConsoleApplication1.MyBase::.ctor()
    IL_000b:     stloc.1
    IL_000c:     ldloc.0
    IL_000d:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth1()
    IL_0012:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0017:     ldloc.0
    IL_0018:     callvirt       instance   string   ConsoleApplication1.MyDerived::Meth2()


    IL_001d:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0022:     ldloc.0
    IL_0023:     callvirt       instance   string   ConsoleApplication1.MyDerived::Meth3()
    IL_0028:     call               void   [mscorlib]System.Console::WriteLine(string)
    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:     ldloc.1
    IL_0038:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth1()
    IL_003d:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0042:     ldloc.1
    IL_0043:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth2()
    IL_0048:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_004d:     ldloc.1
    IL_004e:     callvirt       instance   string   ConsoleApplication1.MyBase::Meth3()
    IL_0053:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_0058:     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_005d:     call               void   [mscorlib]System.Console::WriteLine(string)


    IL_0062:     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_0067:     call               void   [mscorlib]System.Console::WriteLine(string)
    IL_006c:     call               string   [mscorlib]System.Console::ReadLine()
    IL_0071:     pop
    IL_0072:     ret
}   //   end   of   method   Class1::Main

我发现两次中间代码变化的地方主要在
:
IL_0000:     newobj           instance   void   ConsoleApplication1.MyDerived::.ctor()
    IL_0005:     stloc.0
    IL_0006:     newobj           instance   void   ConsoleApplication1.MyBase::.ctor()
    IL_000b:     stloc.1
    IL_000c:     ldloc.0
而下面的居然一样,大家知道两次的输出结果是不一样的.


   


[解决办法]
不是很懂,以前也没碰到过....
[解决办法]
搞程序沒有必要把中間代碼都弄明白吧。

热点排行