程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《C# to IL》第三章 選擇和循環(4)

《C# to IL》第三章 選擇和循環(4)

編輯:關於C語言

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指令。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved