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

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

編輯:關於C語言

尤其需要注意的是,如果IL不支持某 個特性,它就不能用任何.Net編程語言實現。從而,熟悉IL所支持的各種概念的重要性——怎 麼強調都不過分。

a.cs

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

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
ldsfld bool zzz::i
brfalse.s IL_0013
ldstr "hi"
call void [mscorlib]System.Console::WriteLine(class System.String)
br.s IL_001d
IL_0013: ldstr      "false"
call void [mscorlib]System.Console::WriteLine(class System.String)
IL_001d: ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.1
stsfld     bool zzz::i
ret
}
}

Output

hi

在編程語言中,if-else語句是極其容易理解的,但是在IL中它 卻是相當令人困惑的。IL檢查棧上的值是1還是0。

l 如果棧上的值是1,正如這個例子中的那樣, 它調用帶有參數hi的WriteLine函數,並隨後使用無條件跳轉指令br,跳轉到標號IL_001d。

l 如 果棧上的值是0,代碼跳轉到IL_0013,並且WriteLine函數會打印出false。

從而,為了在IL中實 現if-else結構,需要一個有條件跳轉和一個無條件跳轉。如果我們使用多個if-else語句,那麼IL代碼的 復雜度就會動態增加。

現在,可以看出編譯器的編寫者的智商了。

a.cs

class zzz
{
public static void Main()
{
}
void abc( bool a)
{
if (a)
{
int i = 0;
}
if ( a)
{
int i = 3;
}
}
}

a.il

.assembly mukhi {}
.class public auto ansi zzz extends [mscorlib]System.Object
{
.fIEld private int32 x
.method public hidebysig static void vijay() il managed
{
.entrypoint
ret
}
.method private hidebysig instance void abc(bool a) il managed
{
.locals (int32 V_0,int32 V_1)
ldarg.1
brfalse.s IL_0005
ldc.i4.0
stloc.0
IL_0005: ldarg.1
brfalse.s IL_000a
ldc.i4.3
stloc.1
IL_000a: ret
}
}

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