电竞比分网-中国电竞赛事及体育赛事平台

分享

為什么在VS2010中編寫(xiě).net 2.0程序可以調(diào)用C#2.0以上版本特性?

 昵稱10504424 2013-04-11

公司的程序一般使用會(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í)一下。

201206171833245048

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ò)的。

復(fù)制代碼
class Program
{
static void Main(string[] args)
{
///隱式類型變量 (C#3.0特性)
var i = 0;
Console.WriteLine(i.ToString());
Console.ReadKey();
}
}
復(fù)制代碼

使用2.0的C#編譯器,編譯失敗

image

使用4.0的C#編譯器,編譯成功

image

VS2010直接生成得到的ConsoleApplication2.exe,我使用C#編譯器自己生成的是Test.exe文件。現(xiàn)在,我發(fā)現(xiàn)兩個(gè)文件有一點(diǎn)不相同。他們引用的mscorlib.dll版本不同。

imageimage

其實(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)

imageimage

通過(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è)版本的特性):

  1. 直接是IL特性的實(shí)現(xiàn)。比如private 關(guān)鍵字,可以適應(yīng)Reflector查看IL代碼,里面就有private關(guān)鍵字。這種實(shí)現(xiàn)方式不需要調(diào)用其他的資源如dll程序集。
  2. 結(jié)合或者直接就是.Net 版本的另一種實(shí)現(xiàn)方式,需要依靠mscorlib.dll或者其他程序集。比如lock關(guān)鍵字,封裝了Monitor線程處理方法,是一種語(yǔ)法糖。這種特性,沒(méi)有相應(yīng)的dll是不能調(diào)用的。

那么由此C#2.0以上版本的特性,如果屬于第一種情況,那么Net2.0工程中使用是沒(méi)有問(wèn)題的。如果屬于第二種情況,那么需要mscorlib.dll為2.0版本,.Net2.0工程才可以能使用。

經(jīng)過(guò)實(shí)驗(yàn)總結(jié):以下特性是可以使用的

  1. 對(duì)象初始化器
  2. 集合初始化器
  3. 自動(dòng)屬性
  4. 隱式類型變量
  5. 隱式類型數(shù)組
  6. 匿名類型
  7. lamda表達(dá)式
  8. 可選參數(shù)(4.0):其實(shí).Net 2.0版本中 VB語(yǔ)言就實(shí)現(xiàn)了可續(xù)參數(shù)。

總結(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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多