C#編程語言就更復雜了。在內部的一組括號中,我們不能創建之前已經在外部創建的變 量。上面的C#程序在語法上是正確的,因為括號都是在同一級別上。
在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函 數會被調用。
l 如果棧頂的值是0,那麼程序將跳轉到ret指令。