关于.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
而下面的居然一样,大家知道两次的输出结果是不一样的.
[解决办法]
不是很懂,以前也没碰到过....
[解决办法]
搞程序沒有必要把中間代碼都弄明白吧。