你將驚訝地看到由 兩個不同的編譯器所生成的輸出幾乎是相同的。我向你展示了這個示例用以證實——語言的無 關性,最終,源代碼將會被轉換為IL代碼。無論我們使用VB.Net或C#,都會調用相同的WriteLine函數。
因此,程序語言間的不同現在是表面上的問題。無休止的爭論那個語言是最優的是沒有意義的。 從而,IL使得程序員可以自由使用他們所選擇的語言。
讓我們揭開上面給出的代碼的神秘面紗。
每個VB.Net程序都需要被包括在一個模塊中。我們稱之為modmain。Visual Basic中的所有模塊都 是以關鍵字End結束的,從而我們會看到End Module。這是VB在語法上不區別於C#的地方 ——C#不理解模塊是什麼。
在VB.Net中,函數被稱為子程序。我們需要子程序來標注 程序執行的開始位置。這個子程序被稱為Main。
VB.Net代碼不僅關聯到mscorlib.dll,還使用了 文件Microsoft.VisualBasic。
在IL中會創建一個名為_vbProject的類,因為在VB中類的名稱不是 必須的。
稱為_main的函數是子函數的開始,因為它具有entrypoint偽指令。它的名稱前面有一個 下劃線。這些名稱是由VB編譯器選擇用來生成IL代碼的。
這個函數會傳遞一個字符串數組作為參 數。它具有一個自定義偽指令來處理元數據的概念。
接下來,我們具有這個函數的完整原型,以 一系列可選的字節作為終結。這些字節是元數據規范中的一部分。
模塊modmain被轉換為一個具有 相同名稱的類。和之前一樣,這個類還具有相同的偽指令.custom和一個Main函數。該函數使用了名 為.locals的偽指令在棧上創建一個只能在這個方法中使用變量。這個變量只存在於方法執行期間,當方 法停止運行時,它就會“消亡”。
字段還存儲在內存中,但是需要更長的時間來為它 們分配內存。關鍵字init表示在創建期間,這些變量應該被初始化為它們的默認值。默認值依賴於變量的 類型。數值總是被初始化為值ZERO。關鍵字init之後是這些變量的數據類型和它的名稱。