CCLI（CLI Common Language Infrastructure）在計算機語言中是一門由微軟設計，用來代替 C 託管擴充套件（Managed C，下文使用 MC 指代）的語言。這門語言在相容原有的 C 標準的同時，重新簡化了託管程式碼擴充套件的語法，提供了更好的程式碼可讀性。和微軟NET 的其他語言一樣，微軟向 ECMA 提交了 CCLI 的標準化請求，並且被 ECMA 透過成為正式的標準。CCLI 現在可以被 Visual C 2005 和更高版本的編譯器支援。CCLI 的部分特性已經申請了專利。 語法改變 CCLI 是一門獨立的語言（比如新的關鍵字），而不是像 C 託管擴充套件一樣是 C 的超集。（C 託管擴充套件有一些不標準的關鍵字如__gc 和__value）。所以，CCLI 對於這些語法有較大的改變，尤其是去除了一些意義不明確的關鍵字，增加了一些對NET 的特性的語言級別的支援。 關鍵字 有歧義的語法，像 MC 的不同版本用新的運算子 gcnew 區分：在 CCLI，NET 引用型別的建立需要要使用新的關鍵字 gcnew，以和本地型別區分開。 CCLI 增加了新的泛型概念（書寫方式與 C 的模板相似，但行為有很大的測試區別）。 資料型別 基本資料型別 CCLI 基本型別 System 名稱空間中對應的類 C 型別 註釋 用法 bool SystemBoolean bool bool dirty false char 或 signed char SystemSByte sbyte char sp unsigned char SystemByte byte unsigned char ch 0 wchar_t SystemChar char wchar_t wch ch short SystemInt16 short short s ch unsigned short SystemUInt16 ushort unsigned short s 0xffff int 或 long SystemInt32 int int ival s unsigned int 或 unsigned long SystemUInt32 uint unsigned int ui 0xffffffff long long SystemInt64 long long long etime ui unsigned long long SystemUInt64 ulong unsigned long long mtime etime float SystemSingle float float f 314f double 或 long double SystemDouble double double d 314159 控制代碼（Handle）代替了指標 回到 MC，有兩類指標：用__nogc 標識的指標是傳統意義上的 C 指標，而用__gc 標識的指標為NET 中的引用。但在 CCLI 裡，唯一的指標就是傳統意義上的 C 指標，而NET 引用型別使用一個 控制代碼 來獲取，使用新的語法 類名 代替了 MC 的 類名 。新的句法使得託管和非託管程式碼混合開發更加方便；它指明瞭物件將會被垃圾回收器自動銷燬還是手動銷燬。 範例程式碼： C 託管擴充套件 using mscorlibdll using namespace SystemCollections __gc class referencetype protected String stringVar int intArr __gc ArrayList doubleList public referencetype String str，int pointer，int number 哪個是託管的？doubleList new ArrayList SystemConsoleWriteLine strTrim numberToString CCLI using mscorlibdll using namespace SystemCollectionsGeneric ref class referencetype protected String stringVar arrayint intArr Listdouble doubleList public referencetype String str，int pointer，int number 不會再分不清了吧？doubleList gcnew Listdouble SystemConsoleWriteLine strTrim number 託管型別的定義 在 CLR 中，託管型別是分為引用型別（class）和值型別（struct）的，在 CCLI 中的分別定義方式如下： 引用型別： public ref class MyClass 值型別： public value class MyClass 陣列 陣列現在需要用 cli 名字空間內的 array 類宣告，語法和 STL 的 vector 類似。 CCLI 中新增了 arrayT 的方式定義陣列。 arrayint a gcnew arrayint100 1 2 3 或者使用它的完整版： cliarrayint a gcnew cliarrayint 1 2 3 SystemString include string using namespace std using namespace System using namespace SystemRuntimeInteropServices string cast_to_string String str IntPtr ip MarshalStringToHGlobalAnsi str const char ch static_castconst charipToPointer string stdStr ch MarshalFreeHGlobal ip return stdStr 不定引數 對於 C 中的不定引數的語法： void foo params string args 在 CCLI 中對應的版本為： void foo arrayString args 跟蹤引用（Tracking reference） CCLI 裡的一個 跟蹤引用 也是一個控制程式碼，但它是傳地址而不是傳值。等同於在 C 中加了 ref 關鍵字，或 Visual Basic NET 的 ByRef。CCLI 使用 語法來定義一個跟蹤引用。與傳統 C 中的 語法相似。 下面的示例了 跟蹤引用 的使用。如果把 改成 （也就是使用普通的控制代碼），10 個字串將不會被修改，而只會生成那些字串的副本，這些都是因為那些引用已經不是傳地址而是傳值。 int main arrayString arr gcnew arrayString10 int i 0 for each String s in arr s gcnew String iToString return 0 上面的程式碼示例了使用者如何用 CCLI 做一些其他NET 語言不能做的事情，比如 C 就不允許在 foreach 迴圈中這樣做。例如 foreach ref string s in arr 在 C 中是非法的。 析構 FinalizerDestructor CCLI 的另一個變化就是使用 類名 來宣告一個託管型別的 析構方法（在垃圾回收器回收物件之前的不確定的時間由 CLR 呼叫），而原來的 類名 是用來定義 傳統的解構函式（能被使用者自己呼叫）。另外，下面的例子說明了如何在 CCLI 中託管物件如何自動呼叫 傳統解構函式。 在一個典型的NET 程式中（例如直接使用 CLI）程式設計，可以由使用者自己呼叫的 解構方法 是用實現 IDisposable 介面，透過編寫 Dispose 方法來實現顯式釋放資源；而不確定的 解構方法 是透過過載 Finalize 函式來實現的。 CCLI ref class MyClass IDisposable 編譯器自動實現 IDisposable 介面 public MyClass 建構函式 MyClass 確定的 解構函式 編譯器使用 IDisposableDispose 來實現 protected MyClass 解構方法 不確定的 編譯器透過過載 virtual void Finalize 來實現 public static void Test MyClass _auto 這不是個控制程式碼，它將呼叫 MyClass 的預設建構函式 使用_auto 物件 函式返回前自動呼叫_auto 的解構函式 IDisposableDispose，由～MyClass 定義 來釋放資源 以上程式碼等效於 MyClass user gcnew MyClass try 使用_auto 物件 finally delete user 由編譯器呼叫_autoDispose C class MyClass IDisposable public MyClass 建構函式 MyClass 析構方法 不確定的 編譯器透過過載 virtual void Finalize 來實現，與 CCLI 的！MyClass 等效 public void Dispose Dispose 方法 public static void Test using MyClass auto new MyClass 使用 auto 物件 因為使用了 using 句法，編譯器自動呼叫 autoDispose 以上程式碼等效於 MyClass user new MyClass try 使用 user 物件 finally userDispose 引用和參考 外部連結 ECMA CCLI 標準 Category 程式設計語言 CategoryNET 程式語言