WEB开发网
开发学院软件开发C语言 《C# to IL》第三章 选择和循环 阅读

《C# to IL》第三章 选择和循环

 2009-06-01 08:31:05 来源:WEB开发网   
核心提示: 在IL中,会稍微简单一些,《C# to IL》第三章 选择和循环(5),这两个i会变成两个单独的变量V_0和V_1,因此,字段i的值——是1,那么它会跳转到标号IL_0002,IL不会暴露施加在变量上的任何约束,a.csclass zzz{static bool

在IL中,会稍微简单一些。这两个i会变成两个单独的变量V_0和V_1。因此,IL不会暴露施加在变量上的任何约束。

a.cs

class zzz
{
static bool i = true;
public static void Main()
{
while (i)
{
System.Console.WriteLine("hi");
}
}
}

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.field private static bool i
.method public hidebysig static void vijay() il managed
{
.entrypoint
br.s IL_000c
IL_0002: ldstr      "hi"
call void [mscorlib]System.Console::WriteLine(class System.String)
IL_000c: ldsfld     bool zzz::i
brtrue.s IL_0002
ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.1
stsfld     bool zzz::i
ret
}
}

当看到反汇编的代码时,你将理解为什么程序员不以编写IL代码来谋生。即使一个简单的while循环,在转换为IL后都会变得惊人的复杂。

对于一个while结构,会创建一个到标号IL_000c的无条件跳转,它位于函数的结尾。这里,它加载静态变量i的值到栈上。

下一个指令brtrue,做的事情和指令brfalse所做的正好相反。实现如下:

l 如果栈顶的值——例如,字段i的值——是1,那么它会跳转到标号IL_0002。然后值hi被放到栈上并且WriteLine函数会被调用。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:to IL 第三章

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接