適用於 .NET 與 UWP 的元件擴充功能

C++ 標準讓編譯器廠商能夠為此語言提供非標準的擴充功能。 Microsoft 提供擴充功能,可協助您將 C++ 機器碼連線至在 .NET Framework 或通用 Windows 平台 (UWP) 上執行的程式碼。 .NET 擴充功能稱為 C++/CLI,並會產生要在稱為 Common Language Runtime (CLR) 的 .NET 受控執行環境中執行的程式碼。 UWP 擴充功能稱為 C++/CX,而它們會產生原生機器碼。

注意

對於新的應用程式,我們建議使用 C++/WinRT 而不是 C++/CX。 C++/WinRT 是適用於 Windows 執行階段 API 的新標準 C++17 語言投影。 我們將繼續支援 C++/CX 和 WRL,但強烈建議讓新的應用程式使用 C++/WinRT。 如需詳細資訊,請參閱 C++/WinRT

兩種執行階段,一組擴充功能

C++/CLI 會擴充 ISO/ANSI C++ 標準,並根據 Ecma C++/CLI 標準來定義。 如需詳細資訊,請參閱以 C++/CLI 進行 .NET 程式設計 (Visual C++)

C++/CX 擴充功能為 C++/CLI 的子集。 雖然在大部分情況下擴充功能語法會完全相同,但產生的程式碼取決於您是否指定 /ZW 編譯器選項以將目標設定為 UWP,或指定 /clr 選項以將目標設定為 .NET。 當您使用 Visual Studio 以建立專案時,會自動設定這些參數。

資料類型關鍵字

語言擴充功能包含「彙總關鍵字」,這類關鍵字會由空白字元分隔的兩個語彙基元所組成。 當語彙基元分開使用時,可能有一個意義,當它們一起使用時,則有另一個意義。 例如,"ref" 這個字是一般的識別項,而 "class" 這個字是宣告原生類別的關鍵字。 但是,當這些字組合併以形成 ref class 時,產生的彙總關鍵字會宣告實體,也就是「執行階段類別」

擴充功能也包括「內容關鍵性」關鍵字。 關鍵字會被視為視內容而有所區別,取決於包含它的陳述式類型,以及它在該陳述式中的位置。 例如,語彙基元 "property" 可以是識別碼,或者它可以宣告一種特殊的公用類別成員。

下表列出在 C++ 語言擴充功能中的關鍵字。

關鍵字 視內容而有所區別 目的 參考
ref class

ref struct
No 宣告類型。 類別和結構
value class

value struct
No 宣告值類型。 類別和結構
介面類別

interface struct
No 宣告介面。 介面類別
enum 類別

enum struct
No 宣告列舉。 enum 類別
property Yes 宣告屬性。 property
delegate Yes 宣告委派。 委派 (C++/CLI 和 C++/CX)
event Yes 宣告事件。 event

覆寫指定名稱

您可以使用下列關鍵字限定衍生的覆寫行為。 new雖然 關鍵字不是 C++ 的延伸模組,但這裡會列出,因為它可用於其他內容。 某些規範對於原生程式設計也有效。 如需詳細資訊,請參閱 如何:在原生編譯中宣告覆寫規範 (C++/CLI)

關鍵字 視內容而有所區別 目的 參考
abstract Yes 表示函式或類別為抽象。 abstract
new No 表示函式不是基底類別版本的覆寫。 new (vtable 中的新位置)
override Yes 表示方法必須是基底類別版本的覆寫。 override
sealed Yes 避免將類別做為基底類別。 sealed

泛型的關鍵字

下列關鍵字已加入以支援泛型類型。 如需詳細資訊,請參閱泛型

關鍵字 視內容而有所區別 目的
generic No 宣告泛型類型。
where Yes 指定套用至泛型類型參數的條件約束。

其他關鍵字

下列關鍵字已加入至 C++ 擴充功能。

關鍵字 視內容而有所區別 目的 參考
finally Yes 表示預設例外狀況處理行為。 例外狀況處理
for each, in No 列舉集合的項目。 for each, in
gcnew No 在記憶體回收堆積上配置類型。 使用 而非 newdelete ref new、gcnew
ref new Yes 配置 Windows 執行階段型別。 使用 而非 newdelete ref new、gcnew
initonly Yes 表示成員只能在宣告或靜態建構函式中初始化。 initonly (C++/CLI)
literal Yes 建立常值變數。 literal
nullptr No 指出控制代碼或指標未指向物件。 nullptr

範本建構

下列語言建構會實作為範本,而不是關鍵字。 如果您指定 /ZW 編譯器選項,則它們會在 lang 命名空間中定義。 如果您指定 /clr 編譯器選項,則它們會在 cli 命名空間中定義。

關鍵字 目的 參考
array 宣告陣列。 陣列
interior_ptr (只有 CLR) 指向參考類型中的資料。 interior_ptr (C++/CLI)
pin_ptr (只有 CLR) 指向 CLR 參考類型以暫時隱藏記憶體回收系統。 pin_ptr (C++/CLI)
safe_cast 決定並執行執行階段類型的最佳轉型方法。 safe_cast
typeid (只有 CLR) 擷取 System.Type 物件,該物件描述指定類型或物件。 typeid

宣告子

下列類型宣告子會指示執行階段自動管理配置物件的存留期和刪除。

運算子 目的 參考
^ 宣告物件的控制代碼;也就是,一個指向 Windows 執行階段或 CLR 物件的指標,不再使用它時即會自動刪除。 物件控制代碼運算子 (^)
% 宣告追蹤參考;也就是,Windows 執行階段或 CLR 物件的參考,不再使用它時即會自動刪除。 追蹤參考運算子

本節列出與 CLR 有關的其他程式設計建構和主題。

主題 說明
__identifier (C++/CLI) (Windows 執行階段和 CLR) 可將關鍵字當作識別碼使用。
變數引數清單 (...) (C++/CLI) (Windows 執行階段和 CLR) 讓函式能夠接受可變數目的引數。
C++ 原生類型的 .NET Framework 對等項 (C++/CLI) 列出用來取代 C++ 整數類型的 CLR 類型。
appdomain __declspec 修飾詞 __declspec 強制靜態和全域變數存在於每個 appdomain 的修飾詞。
使用 /clr 進行 C-Style 轉換 (C++/CLI) 描述 C-style 轉換的解譯方式。
__clrcall 呼叫慣例 表示符合 CLR 標準的呼叫慣例。
__cplusplus_cli 預先定義的巨集
自訂屬性 描述如何定義您自己的 CLR 屬性。
例外狀況處理 提供例外狀況處理的概觀。
明確覆寫 示範成員函式如何覆寫任意成員。
Friend 組件 (C++) 討論用戶端組件如何存取組件元件中的所有類型。
Boxing 示範 boxed 處理值類型的條件。
類型特徵的編譯器支援 討論如何在編譯時偵測類型的特性。
managed、unmanaged pragmas 示範 Managed 和 Unmanaged 函式如何共存於相同的模組。
進程 __declspec 修飾詞 __declspec 強制每個進程存在靜態和全域變數的 修飾詞。
反映 (C++/CLI) 示範執行階段類型資訊的 CLR 版本。
String 討論字串常值到 String 的編譯器轉換。
類型轉送 (C++/CLI) 在傳送組件中讓類型移動到另一個組件,讓用戶端程式碼不需要重新編譯。
使用者定義屬性 示範使用者定義屬性。
#using 指示詞 匯入外部組件。
XML 文件 使用 /doc (處理文件註解) (C/C++) 來說明 XML 型程式碼文件

另請參閱

以 C++/CLI 進行 .NET 程式設計 (Visual C++)
原生和 .NET 互通性