C++/CLI 同時支援堆疊語意 (值類別) 與堆語意 (參考類別) 物件。但 CLI 規範 (C#、VB.NET 等) 僅支援堆上物件 (參考型別)。跨語言互操作時,需理解「複製」 (Cloning) 機制:為參考型別建立獨立副本,而非共用同一物件參考。
using namespace System;
using namespace System::Collections;
void PrintEntries(String^ s, ArrayList^ a) {
Console::Write("{0}: ", s);
for each (Object^ o in a) Console::Write("\t{0}", o);
Console::WriteLine();
}
int main() {
ArrayList^ al1 = gcnew ArrayList;
al1->Add("Red"); al1->Add("Blue"); al1->Add("Green"); al1->Add("Yellow");
PrintEntries("al1", al1); // 1. 原始
ArrayList^ al2 = static_cast(al1->Clone()); // 2. 淺層複製
PrintEntries("al2", al2); // 3. 複本內容相同
al1->Remove("Blue");
al1->Add("Black");
al1->RemoveAt(0);
al1->Insert(0, "Brown");
PrintEntries("al1", al1); // 4. 修改原始
PrintEntries("al2", al2); // 5. 複本不受影響 (元素為不可變字串)
}
輸出顯示 al2 保持原狀,證明 Clone 建立了新的 ArrayList 實例 (淺層複製)。若元素為可變物件,修改元素內容仍會互相影響,需實作深層複製 (自行遞迴 Clone)。
C++/CLI 使用 % 宣告追蹤參考,對應 C# 的 ref/out。針對參考型別實例,因 GC 可能移動物件,普通指標 * 或參考 & 無法追蹤,必須用 %。
void Swap(Point^ %a, Point^ %b) { // 交換兩個參考型別變數指向的物件
Point^ tmp = a; a = b; b = tmp;
}
此機制確保在 CLI 執行環境中安全操作參考型別變數本身 (而非物件內容)。