VS.NET 2002/2003 的 Managed C++(MC++)雖能編寫 .NET 程式,但語法晦澀(雙底線關鍵字)、CLI 支援不完整、原生與受控型別互通困難。2003 年 ECMA 成立專家組,制定 C++/CLI 標準(ECMA-372),Visual Studio 2005 正式支援。
__gc、__value、__interface 等閱讀負擔重。* 與受控 __gc* 同符號卻語意迥異。ref class、value struct、interface class、property、delegate、event、generic 皆為一級語法。pin_ptr、marshal_as 簡化封送。// C++/CLI (VS2005+)
using namespace System;
void _tmain() { Console::WriteLine("Hello World"); }
// 無需 #using ,/clr 隱含參考
^(帽子符號)代表受控物件參考,對應舊語法 __gc*。關鍵差異:
| 特性 | 原生指標 * | 控制碼 ^ |
|---|---|---|
| 指向 | 固定記憶體位址 | 受控堆,GC 可能移動 |
| 生命週期 | 手動 delete | GC 自動回收 |
| 型別安全 | 可轉 void* | 嚴格型別,不可為 void^ |
| 建立關鍵字 | new | gcnew |
void _tmain()
{
String^ str = gcnew String("Hello World");
Object^ o1 = gcnew Object();
Console::WriteLine(str);
}
gcnew 分配於 CLR 堆並回傳 ^,明確區分受控/非受控建構。
ref class、屬性、索引子、泛型約束。pin_ptr、marshal_context、#pragma managed/unmanaged。