读书人

关于.NET 中间语言有关问题高手请不

发布时间: 2012-03-24 14:00:46 作者: rapoo

关于.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
而下面的居然一样,大家知道两次的输出结果是不一样的.





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

读书人网 >C#

热点推荐