函數abc示范了這個概念。在這個函數中,代碼繞過了指令 ldc.i4.s 30。因此,返回值顯示為20而不是30。從而,IL使用br指令來無條件地跳躍到代碼的
尤其需要注意的是,如果IL不支持某 個特性,它就不能用任何.Net編程語言實現。從而,熟悉IL所支持的各種概念的重要性——怎 麼強調都不過分。a.csclas
C#編程語言就更復雜了。在內部的一組括號中,我們不能創建之前已經在外部創建的變 量。上面的C#程序在語法上是正確的,因為括號都是在同一級別上。在IL中,會稍微
“不等於”操作符,也就是!=,是==的相反操作 。它使用了兩個ceq指令。第1個ceq指令用來檢查棧上的值是否相等。如果它們是相等的,它就會返回 TRUE;否
老生常談,while和for結構提供了相同的功能,可以互 相轉換。在for循環中,第1個分號之前的代碼只能被執行一次。因此,將要被初始化的變量i,位 於循環的
在C#中,do循環和while循環之間的區別是——條 件在什麼位置被檢查。l 在do-while循環中,條件會在循環的結尾被檢查。這意味著循環中的代 碼至少會
break語句強迫退出for循環、while循環或do-while循環。和往 常一樣,我們跳轉到標號IL_0014,也就是變量V_0或i的值被放置到棧上的地方
continue語句控制for循環到達結束位置。當if語句結果為TRUE時,程序將繞過 WriteLine函數而跳轉到循環的結束。然後,代碼將在標號IL_00
在exe文件上執行ildasm後,我們觀察一 下該程序所生成的IL代碼。先排除一部分代碼——它們對我們理解IL是沒有任何幫助的 ——包括一些注釋、偽指令和函數
靜態構造函數總是在任何其它代碼執行之前被調用 。在C#中,靜態函數只是一個和類具有相同名稱的函數。在IL中,函數名稱改變為.cctor。因此,你可能 注意到在
在C#中的關鍵字new,被轉換為匯編器指令newobj。 這就為IL不是一門低級匯編語言並且還可以在內存中創建對象提供了證據。指令newobj在內存中創建了一
盡管實例構造函數只在new之後被調用 ,但靜態構造函數總是會首先被調用。IL會強制這個執行的順序。對基類構造函數的調用不是必須的。因 此,為了節省本書的篇幅,
歷經艱難之後,現在,你終於看到了成功,並明白我們為什麼想要你首先閱讀本書了。讓我們理解上面的代碼,每次一個字段。我們創建了一個靜態變量i,並將其初始化為值6。
面這個例子的主要意圖是,驗證首先初始化變 量還是首先調用包含在構造函數中的代碼。IL輸出非常清晰地證實了——首先初始化所有的變 量,然後再調用構造函數中的代碼
上面的代碼用來顯示靜態變量的值。.cctor函數將靜態變量初 始化為值10。然後,字符串{0}會被存儲到棧上。ldsldfa函數加載棧上某個數據類型的靜態變量