CTS,、CLS和CLR是.NET框架的基本概念,但往往成為程序員們忽視的部分,。清楚理解三者的概念,,有助于.NET程序員編寫(xiě)高效安全的.NET程序。 所涉及到的知識(shí)點(diǎn) • .NET的基本概念 • CLS,、CTS和常用語(yǔ)言的關(guān)系 分析問(wèn)題 CLR的全稱(chēng)是公共語(yǔ)言運(yùn)行庫(kù)(Common Language Runtime),,讀者可以把CLR理解為一個(gè)包含運(yùn)行.NET程序的引擎和一堆符合公共語(yǔ)言基礎(chǔ)結(jié)構(gòu)的類(lèi)庫(kù)的集合。CLR是一個(gè)規(guī)范的實(shí)現(xiàn),,我們開(kāi)發(fā)的 幾乎所有的.NET程序都基于CLR的類(lèi)庫(kù)來(lái)實(shí)現(xiàn),,并且運(yùn)行在CLR提供的運(yùn)行引擎之上。所謂.NET框架,指的就是公共語(yǔ)言運(yùn)行庫(kù),。 公共語(yǔ)言基礎(chǔ)(CLI)是微軟公司向ECMA提交的一份語(yǔ)言和數(shù)據(jù)格式規(guī)范,,CLR是目前為止唯一一個(gè)公共語(yǔ)言基礎(chǔ)的實(shí)現(xiàn)版本。 CTS 的全稱(chēng)是通用類(lèi)型系統(tǒng)(Common Type System),。前文已經(jīng)介紹了公共語(yǔ)言基礎(chǔ)(CLI)的概念,,微軟公司提交的CLI規(guī)范,包括了公共類(lèi)型系統(tǒng)(CTS),、公共中間語(yǔ)言(CIL),、底部 文件格式以及元數(shù)據(jù)格式等。公共類(lèi)型系統(tǒng)定義了一個(gè)能夠在CLR上運(yùn)行的語(yǔ)言規(guī)范,。盡管有很多語(yǔ)言本身不符合CTS規(guī)范,,但是通過(guò)加強(qiáng)編譯器,改變語(yǔ)言附 加規(guī)范等手段,,使得許多語(yǔ)言能夠編寫(xiě)出能在CLR上運(yùn)行的程序,。 一種語(yǔ)言編寫(xiě)的程序編譯能夠在CLR上運(yùn)行,并不代表這種語(yǔ)言本身完全符合CTS的規(guī)范,。例如C++語(yǔ)言,,仍然保持了其不符合CTS規(guī)范的部分,并且在編譯時(shí)把這部分不符合CTS的代碼編譯成原始代碼而非中間代碼,。 最后來(lái)看一下CLS的概念,。公共語(yǔ)言規(guī)范(CLS)是CTS的一個(gè)子集,它定義了希望編寫(xiě)在.NET平臺(tái)上運(yùn)行的程序的語(yǔ)言所需符合的最小規(guī)范,。正因?yàn)?NET允許由不同語(yǔ)言編寫(xiě)的程序一起執(zhí)行,,所以才制定出CLS規(guī)范,用以避免不同語(yǔ)言特性產(chǎn)生的錯(cuò)誤,。 為了更直觀地理解CLS,,來(lái)看這段C#代碼: 代碼2-1 CLS規(guī)范:CLS.cs using System; using System.Collections.Generic; using System.Text; //申明C符合CLS規(guī)范 [assembly: CLSCompliantAttribute(true)] namespace NET.MST.Second { public class CLS { private uint i; //這是一個(gè)私有成員,所以不違反CLS規(guī)范 public CLS() { i=0; } static void Main(string[] args) { } //這里不符合CLS規(guī)范,,uint在CLS中沒(méi)有定義 public uint GetI() { return i; } } } 在 代碼2-1中,,程序通過(guò)CLSCompliantAttribute特性來(lái)申明CLS類(lèi)型需要符合CLS規(guī)范。C#中的uint類(lèi)型在CLS中沒(méi)有對(duì)應(yīng)的 類(lèi)型,,所以u(píng)int是不符合CLS的語(yǔ)言部分,。在CLS類(lèi)的一開(kāi)始,程序定義了一個(gè)uint類(lèi)型的私有成員變量i,,這里并沒(méi)有造成CLS類(lèi)不符合CLS規(guī) 范,,因?yàn)樗接凶兞恐粚?duì)類(lèi)內(nèi)部可見(jiàn)。而之后程序定義了一個(gè)返回uint類(lèi)型的公共方法,,這里造成了整個(gè)CLS類(lèi)型不符合CLS規(guī)范,。編譯這段代碼,,會(huì)得到以 下警告: C:\David\NET MST\第章\CLS.cs(23,21): warning CS3002: Return type of 'NET.MST.Second.CLS.GetI()' is not CLS-compliant 現(xiàn)在,讀者已經(jīng)理解了CLS和CTS的關(guān)系 答案 公共語(yǔ)言運(yùn)行庫(kù)(CLR)是一個(gè)CLI的實(shí)現(xiàn),,包含了.NET運(yùn)行引擎和符合CLI的類(lèi)庫(kù),。 通用類(lèi)型系統(tǒng)(CTS)包含在微軟公司提交的CLI規(guī)范中,定義了一個(gè)可以在CLR上運(yùn)行的類(lèi)型規(guī)范,。 公共語(yǔ)言規(guī)范是CTS的一個(gè)子集,,定義了所有面向.NET的程序需要符合的最小規(guī)范集。
|