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