乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       昵稱10504424 2013-04-11

      公司的程序一般使用會使用.Net 2.0,在使用VS2010編寫程序后,發(fā)現(xiàn)使用了一些C#3.0,C#4.0特性后,程序居然也可以正常運(yùn)行,對此一直有點迷惑,最近花了點時間仔細(xì)研究了一下。

      在討論為什么VS2010會出現(xiàn)這種情況之前,先引入幾個概念,我們重新認(rèn)識一下。

      201206171833245048

      C#版本與C#編譯器

      C#源代碼要編譯成IL中間語言,需要調(diào)用C#編譯器。C#編譯器其實是一個名為csc.exe的可執(zhí)行文件,通常位于系統(tǒng)目錄下的 Microsoft.NET\Framework\<version> 文件夾中,version指的是.Net的版本,我的電腦中裝有VS2005 VS2008 VS2010時,里面有v1.0 、v1.1 、v2.0、 v3.0、 v3.5、 v4.0幾個版本。經(jīng)過查看,我發(fā)現(xiàn)v2.0 、v3.5、 v4.0里面含有csc.exe文件,而這正好和C#的版本是對應(yīng)的。不難想到,不同版本C#編譯器代表編譯過程中遵循不同C#版本的語法

      現(xiàn)在回到我們的問題:VS2010中.Net2.0工程可以使用C#2.0版本以上的特性。初步可以懷疑VS2010編譯時調(diào)用的是4.0版本的C#編譯器,而不是2.0版本的C#編譯器。

      下面實際編譯一段代碼來試驗一下。這段代碼在VS2010生成是可以通過的。

      復(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)兩個文件有一點不相同。他們引用的mscorlib.dll版本不同。

      imageimage

      其實,在設(shè)置項目工程的.Net Framework版本時,就是設(shè)置C#編譯器編譯時調(diào)用對應(yīng)版本的mscorlib.dll文件。(mscorlib.dll到底代表什么,可以查閱CTS BFL等概念)

      雖然現(xiàn)在兩個exe文件中的引用不同,但是我們可以手工調(diào)用對應(yīng)版本的mscorlib.dll文件,重新生成一個exe文件。(/nostdlib 禁止導(dǎo)入定義整個 System 命名空間的 mscorlib.dll,也就是4.0的mscorlib.dll)

      imageimage

      通過以上實驗,可以說明VS2010調(diào)用了4.0版本的C#編譯器。

      C#特性的實現(xiàn)

      VS2010調(diào)用了4.0版本的C#編譯器成功編譯了.Net 2.0工程的源代碼,說明C#源代碼成功編譯成IL中間語言代碼。但是C#2.0版本以上的特征為什么可以成功編譯,還沒有明白。

      C#是高級語言,IL是相對C#低級一些。C#特性在實現(xiàn)上要依賴IL特性。在此我能想到的C#特性的實現(xiàn)有兩種(關(guān)于什么才能稱為特性,我暫且認(rèn)為這個版本新增的就為這個版本的特性):

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

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

      經(jīng)過實驗總結(jié):以下特性是可以使用的

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

      總結(jié)

      有高版本的C#編譯器,就可以使用C#高版本的特性。能用的特性盡情的用,不能用的特性會報錯誤,自然也就無法用了。

      為什么在VS2010中編寫.net 2.0程序可以調(diào)用C#2.0以上版本特性?其實從這個問題中,便可以發(fā)現(xiàn)我將.Net版本與C#版本的概念混淆了。這句話應(yīng)該這樣,在VS2010開發(fā)環(huán)境下,使用的是4.0版本的C#編譯器,如果創(chuàng)建.Net 2.0項目,可以使用C#4.0中任何不依賴.Net和僅依賴于.Net 2.0的C#特性

       

      本文寫的十分淺薄,請結(jié)合一下兩篇文章閱讀,會更清楚一些。

      http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html

      http://www.cnblogs.com/PurpleCow/archive/2012/06/17/2552780.html

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多