|
公司的程序一般使用會(huì)使用.Net 2.0,在使用VS2010編寫(xiě)程序后,發(fā)現(xiàn)使用了一些C#3.0,C#4.0特性后,程序居然也可以正常運(yùn)行,對(duì)此一直有點(diǎn)迷惑,最近花了點(diǎn)時(shí)間仔細(xì)研究了一下。 在討論為什么VS2010會(huì)出現(xiàn)這種情況之前,先引入幾個(gè)概念,我們重新認(rèn)識(shí)一下。
C#版本與C#編譯器C#源代碼要編譯成IL中間語(yǔ)言,需要調(diào)用C#編譯器。C#編譯器其實(shí)是一個(gè)名為csc.exe的可執(zhí)行文件,通常位于系統(tǒng)目錄下的 Microsoft.NET\Framework\<version> 文件夾中,version指的是.Net的版本,我的電腦中裝有VS2005 VS2008 VS2010時(shí),里面有v1.0 、v1.1 、v2.0、 v3.0、 v3.5、 v4.0幾個(gè)版本。經(jīng)過(guò)查看,我發(fā)現(xiàn)v2.0 、v3.5、 v4.0里面含有csc.exe文件,而這正好和C#的版本是對(duì)應(yīng)的。不難想到,不同版本C#編譯器代表編譯過(guò)程中遵循不同C#版本的語(yǔ)法。 現(xiàn)在回到我們的問(wèn)題:VS2010中.Net2.0工程可以使用C#2.0版本以上的特性。初步可以懷疑VS2010編譯時(shí)調(diào)用的是4.0版本的C#編譯器,而不是2.0版本的C#編譯器。 下面實(shí)際編譯一段代碼來(lái)試驗(yàn)一下。這段代碼在VS2010生成是可以通過(guò)的。 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文件。現(xiàn)在,我發(fā)現(xiàn)兩個(gè)文件有一點(diǎn)不相同。他們引用的mscorlib.dll版本不同。
其實(shí),在設(shè)置項(xiàng)目工程的.Net Framework版本時(shí),就是設(shè)置C#編譯器編譯時(shí)調(diào)用對(duì)應(yīng)版本的mscorlib.dll文件。(mscorlib.dll到底代表什么,可以查閱CTS BFL等概念) 雖然現(xiàn)在兩個(gè)exe文件中的引用不同,但是我們可以手工調(diào)用對(duì)應(yīng)版本的mscorlib.dll文件,重新生成一個(gè)exe文件。(/nostdlib 禁止導(dǎo)入定義整個(gè) System 命名空間的 mscorlib.dll,也就是4.0的mscorlib.dll)
通過(guò)以上實(shí)驗(yàn),可以說(shuō)明VS2010調(diào)用了4.0版本的C#編譯器。 C#特性的實(shí)現(xiàn)VS2010調(diào)用了4.0版本的C#編譯器成功編譯了.Net 2.0工程的源代碼,說(shuō)明C#源代碼成功編譯成IL中間語(yǔ)言代碼。但是C#2.0版本以上的特征為什么可以成功編譯,還沒(méi)有明白。 C#是高級(jí)語(yǔ)言,IL是相對(duì)C#低級(jí)一些。C#特性在實(shí)現(xiàn)上要依賴IL特性。在此我能想到的C#特性的實(shí)現(xiàn)有兩種(關(guān)于什么才能稱為特性,我暫且認(rèn)為這個(gè)版本新增的就為這個(gè)版本的特性):
那么由此C#2.0以上版本的特性,如果屬于第一種情況,那么Net2.0工程中使用是沒(méi)有問(wèn)題的。如果屬于第二種情況,那么需要mscorlib.dll為2.0版本,.Net2.0工程才可以能使用。 經(jīng)過(guò)實(shí)驗(yàn)總結(jié):以下特性是可以使用的
總結(jié)有高版本的C#編譯器,就可以使用C#高版本的特性。能用的特性盡情的用,不能用的特性會(huì)報(bào)錯(cuò)誤,自然也就無(wú)法用了。 為什么在VS2010中編寫(xiě).net 2.0程序可以調(diào)用C#2.0以上版本特性?其實(shí)從這個(gè)問(wèn)題中,便可以發(fā)現(xiàn)我將.Net版本與C#版本的概念混淆了。這句話應(yīng)該這樣,在VS2010開(kāi)發(fā)環(huán)境下,使用的是4.0版本的C#編譯器,如果創(chuàng)建.Net 2.0項(xiàng)目,可以使用C#4.0中任何不依賴.Net和僅依賴于.Net 2.0的C#特性。
本文寫(xiě)的十分淺薄,請(qǐng)結(jié)合一下兩篇文章閱讀,會(huì)更清楚一些。 http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html http://www.cnblogs.com/PurpleCow/archive/2012/06/17/2552780.html |
|
|
來(lái)自: 昵稱10504424 > 《工作》