公司的程序一般使用會使用.Net 2.0,在使用VS2010編寫程序后,發現使用了一些C#3.0,C#4.0特性后,程序居然也可以正常運行,對此一直有點迷惑,最近花了點時間仔細研究了一下。
在討論為什么VS2010會出現這種情況之前,先引入幾個概念,我們重新認識一下。
C#版本與C#編譯器
C#源代碼要編譯成IL中間語言,需要調用C#編譯器。C#編譯器其實是一個名為csc.exe的可執行文件,通常位於系統目錄下的 Microsoft.NET\Framework\<version> 文件夾中,version指的是.Net的版本,我的電腦中裝有VS2005 VS2008 VS2010時,里面有v1.0 、v1.1 、v2.0、 v3.0、 v3.5、 v4.0幾個版本。經過查看,我發現v2.0 、v3.5、 v4.0里面含有csc.exe文件,而這正好和C#的版本是對應的。不難想到,不同版本C#編譯器代表編譯過程中遵循不同C#版本的語法。
現在回到我們的問題:VS2010中.Net2.0工程可以使用C#2.0版本以上的特性。初步可以懷疑VS2010編譯時調用的是4.0版本的C#編譯器,而不是2.0版本的C#編譯器。
下面實際編譯一段代碼來試驗一下。這段代碼在VS2010生成是可以通過的。
class Program { static void Main(string[] args) { ///隱式類型變量 (C#3.0特性)
var i = 0; Console.WriteLine(i.ToString()); Console.ReadKey(); } }
使用2.0的C#編譯器,編譯失敗
使用4.0的C#編譯器,編譯成功
VS2010直接生成得到的ConsoleApplication2.exe,我使用C#編譯器自己生成的是Test.exe文件。現在,我發現兩個文件有一點不相同。他們引用的mscorlib.dll版本不同。
其實,在設置項目工程的.Net Framework版本時,就是設置C#編譯器編譯時調用對應版本的mscorlib.dll文件。(mscorlib.dll到底代表什么,可以查閱CTS BFL等概念)
雖然現在兩個exe文件中的引用不同,但是我們可以手工調用對應版本的mscorlib.dll文件,重新生成一個exe文件。(/nostdlib 禁止導入定義整個 System 命名空間的 mscorlib.dll,也就是4.0的mscorlib.dll)
通過以上實驗,可以說明VS2010調用了4.0版本的C#編譯器。
C#特性的實現
VS2010調用了4.0版本的C#編譯器成功編譯了.Net 2.0工程的源代碼,說明C#源代碼成功編譯成IL中間語言代碼。但是C#2.0版本以上的特征為什么可以成功編譯,還沒有明白。
C#是高級語言,IL是相對C#低級一些。C#特性在實現上要依賴IL特性。在此我能想到的C#特性的實現有兩種(關於什么才能稱為特性,我暫且認為這個版本新增的就為這個版本的特性):
- 直接是IL特性的實現。比如private 關鍵字,可以適應Reflector查看IL代碼,里面就有private關鍵字。這種實現方式不需要調用其他的資源如dll程序集。
- 結合或者直接就是.Net 版本的另一種實現方式,需要依靠mscorlib.dll或者其他程序集。比如lock關鍵字,封裝了Monitor線程處理方法,是一種語法糖。這種特性,沒有相應的dll是不能調用的。
那么由此C#2.0以上版本的特性,如果屬於第一種情況,那么Net2.0工程中使用是沒有問題的。如果屬於第二種情況,那么需要mscorlib.dll為2.0版本,.Net2.0工程才可以能使用。
經過實驗總結:以下特性是可以使用的
- 對象初始化器
- 集合初始化器
- 自動屬性
- 隱式類型變量
- 隱式類型數組
- 匿名類型
- lamda表達式
- 可選參數(4.0):其實.Net 2.0版本中 VB語言就實現了可續參數。
總結
有高版本的C#編譯器,就可以使用C#高版本的特性。能用的特性盡情的用,不能用的特性會報錯誤,自然也就無法用了。
為什么在VS2010中編寫.net 2.0程序可以調用C#2.0以上版本特性?其實從這個問題中,便可以發現我將.Net版本與C#版本的概念混淆了。這句話應該這樣,在VS2010開發環境下,使用的是4.0版本的C#編譯器,如果創建.Net 2.0項目,可以使用C#4.0中任何不依賴.Net和僅依賴於.Net 2.0的C#特性。
本文寫的十分淺薄,請結合一下兩篇文章閱讀,會更清楚一些。
http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html
http://www.cnblogs.com/PurpleCow/archive/2012/06/17/2552780.html