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

《C# to IL》第二章 IL基礎(10)

編輯:關於C語言

我們將局部變量i初始化為值0。這是不能在構造函數中完成的 ,因為變量i還沒有在棧上被創建。然後,使用stloc.0來分配值10到V_0。之後,使用ldloc.0來把變量 V_0放到棧上,從而它對於WriteLine函數是可用的。

之後,Writeline函數在屏幕上顯示這個值。 字段和本地變量具有類似的行為,只有一點不同——它們使用不同的指令。

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (int32 V_0)
ldloc.0
call       void [mscorlib]System.Console::WriteLine(int32)
ret
}
}

Output

51380288

所有的局部變量都必須被初始化,否則,編譯器就會生 成一個莫名其妙的錯誤信息。這裡,即使我們注釋了ldc和stloc指令,也不會有錯誤在運行時生成。然而 ,會顯示一個非常巨大的數字。

變量V_0沒有被初始化為任何值,它是在棧上創建的,並包括在內 存位置上分配給它的任何可用的值。在你我機器上的輸出會有很大不同。

在類似的情況中,C#編 譯器將丟給你一個錯誤,並且不允許你進一步繼續下去,因為變量還沒有被初始化。另一方面,IL是一個 “怪胎”。它的要求是很寬松的。它生成非常少的錯誤或在源代碼上進行非常少的健康檢查。 但也存在缺點,就是說,程序員在使用IL時不得不更加小心和盡職盡責。

a.cs

class zzz
{
static int i;
public static void Main()
{
i = 10;
System.Console.WriteLine("{0}",i);
}
}

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.fIEld private static int32 i
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.s   10
stsfld     int32 zzz::i
ldstr      "{0}"
ldsflda    int32 zzz::i
box  [mscorlib]System.Int32
call void [mscorlib]System.Console::WriteLine(class System.String,class System.Object)
ret
}
}

Output

10

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