Estensioni componenti per .NET e UWP
Lo standard C++ permette ai fornitori di compilatori di fornire estensioni non standard per il linguaggio. Microsoft offre estensioni per semplificare la connessione di codice C++ nativo a codice che viene eseguito in .NET Framework o nella piattaforma UWP (Universal Windows Platform). Le estensioni .NET sono note come C++/CLI e producono codice che viene eseguito nell'ambiente di esecuzione gestito .NET denominato Common Language Runtime (CLR). Le estensioni della piattaforma UWP sono note come C++/CX e producono codice macchina nativo.
Nota
Per le nuove applicazioni, è consigliabile usare C++/WinRT invece di C++/CX. C++/ WinRT è una nuova proiezione del linguaggio C++17 standard per API Windows Runtime. Microsoft continuerà a supportare C++/CX e WRL, ma è consigliabile usare C++/WinRT per le nuove applicazioni. Per altre informazioni, vedi C++/WinRT.
Due runtime, un set di estensioni
C++/CLI estende lo standard ISO/ANSI C++ ed è definito nello standard Ecma C++/CLI. Per altre informazioni, vedere Programmazione .NET con C++/CLI (Visual C++).
Le estensioni C++/CX sono un subset di C++/CLI. Sebbene la sintassi delle estensioni sia identica nella maggior parte dei casi, il codice generato dipende dal fatto che si specifichi o meno l'opzione del compilatore /ZW
per la piattaforma UWP come destinazione oppure l'opzione /clr
per .NET come destinazione. Queste opzioni vengono impostate automaticamente quando si usa Visual Studio per creare un progetto.
Parole chiave del tipo di dati
Le estensioni del linguaggio includono parole chiave aggregate, che sono costituite da due token separati da uno spazio vuoto. I token hanno un significato quando vengono usati separatamente e un altro significato quando vengono usati insieme. Ad esempio, la parola "ref" è un identificatore standard e la parola "class" è una parola chiave che dichiara una classe nativa. Tuttavia, quando queste parole vengono combinate a formare ref class, la parola chiave aggregata risultante dichiara un'entità nota come classe di runtime.
Le estensioni includono anche parole chiave sensibili al contesto. Una parola chiave viene considerata come sensibile al contesto in base al tipo di istruzione che la contiene e alla relativa posizione nell'istruzione. Ad esempio, il token "property" può essere un identificatore o può dichiarare un tipo speciale di membro di classe pubblica.
Nella tabella seguente sono elencate le parole chiave nell'estensione del linguaggio C++.
Parola chiave | Sensibile al contesto | Scopo | Riferimento |
---|---|---|---|
ref class ref struct |
No | Dichiara una classe. | Classi e struct |
value class value struct |
No | Dichiara una classe di valori. | Classi e struct |
interface class interface struct |
No | Dichiara un'interfaccia. | interface class |
enum class enum struct |
No | Dichiara un'enumerazione. | enum class |
property |
Sì | Dichiara una proprietà. | property |
delegate | Sì | Dichiara un delegato. | delegate (C++/CLI e C++/CX) |
event | Sì | Dichiara un evento. | event |
Identificatori di override
È possibile usare le parole chiave seguenti per qualificare il comportamento di override per la derivazione. Anche se la new
parola chiave non è un'estensione di C++, è elencata qui perché può essere usata in un contesto aggiuntivo. Alcuni identificatori sono validi anche per la programmazione nativa. Per altre informazioni, vedere Procedura: Dichiarare identificatori di override nelle compilazioni native (C++/CLI).
Parola chiave | Sensibile al contesto | Scopo | Riferimento |
---|---|---|---|
abstract | Sì | Indica che le funzioni o classi sono astratte. | abstract |
new |
No | Indica che una funzione non è un override di una versione della classe di base. | new (nuovo slot in vtable) |
override | Sì | Indica che un metodo deve essere un override di una versione della classe base. | override |
sealed | Sì | Impedisce l'uso delle classi come classi base. | sealed |
Parole chiave per i generics
Le parole chiave seguenti sono state aggiunte per supportare tipi generici. Per altre informazioni, vedere Generics.
Parola chiave | Sensibile al contesto | Scopo |
---|---|---|
generic | No | Dichiara un tipo generico. |
where | Sì | Specifica i vincoli che vengono applicati a un parametro di tipo generico. |
Varie parole chiave
Le parole chiave seguenti sono state aggiunte alle estensioni di C++.
Parola chiave | Sensibile al contesto | Scopo | Riferimento |
---|---|---|---|
finally | Sì | Indica il comportamento di gestione delle eccezioni predefinito. | Gestione delle eccezioni |
for each, in | No | Enumera gli elementi di una raccolta. | for each, in |
gcnew | No | Alloca tipi sull'heap sottoposto a Garbage Collection. Usare anziché new e delete . |
ref new, gcnew |
ref new | Sì | Alloca un tipo Windows Runtime. Usare anziché new e delete . |
ref new, gcnew |
initonly | Sì | Indica che un membro può essere inizializzato solo in fase di dichiarazione o in un costruttore statico. | initonly (C++/CLI) |
literal | Sì | Crea una variabile letterale. | literal |
nullptr |
No | Indica che un handle o un puntatore non punta a un oggetto. | nullptr |
Costrutti di modello
I seguenti costrutti di linguaggio vengono implementati come modelli, anziché come parole chiave. Se si specifica l'opzione del compilatore /ZW
, sono definiti nello spazio dei nomi lang
. Se si specifica l'opzione del compilatore /clr
, sono definiti nello spazio dei nomi cli
.
Parola chiave | Scopo | Riferimento |
---|---|---|
array | Dichiara una matrice. | Matrici |
interior_ptr | (Solo CLR) Punta ai dati in un tipo riferimento. | interior_ptr (C++/CLI) |
pin_ptr | (Solo CLR) Punta a tipi riferimento CLR per evitare temporaneamente il sistema di Garbage Collection. | pin_ptr (C++/CLI) |
safe_cast | Determina ed esegue il metodo di cast ottimale per un tipo di runtime. | safe_cast |
typeid |
(Solo CLR) Recupera un oggetto System.Type che descrive il tipo o l'oggetto specificato. | typeid |
Dichiaratori
I dichiaratori di tipo seguenti indicano al runtime di gestire automaticamente la durata e l'eliminazione degli oggetti allocati.
Operatore | Scopo | Riferimento |
---|---|---|
^ |
Dichiara un handle a un oggetto, ovvero un puntatore a un oggetto Windows Runtime o CLR che viene automaticamente eliminato quando non è più utilizzabile. | Operatore handle a oggetto (^) |
% |
Dichiara un riferimento di rilevamento, ovvero un riferimento a un oggetto Windows Runtime o CLR che viene automaticamente eliminato quando non è più utilizzabile. | Operatore di riferimento di rilevamento |
Costrutti aggiuntivi e argomenti correlati
In questa sezione vengono elencati i costrutti di programmazione aggiuntivi e gli argomenti relativi a CLR.
Argomento | Descrizione |
---|---|
__identifier (C++/CLI) | (Windows Runtime e CLR) Permette di usare parole chiave come identificatori. |
Elenchi di argomenti variabili (...) (C++/CLI) | (Windows Runtime e CLR) Permette ad alcune funzioni di accettare un numero variabile di argomenti. |
Equivalenti di .NET Framework a tipi nativi C++ (C++/CLI) | Elenca i tipi CLR usati al posto dei tipi integrali di C++. |
modificatore di appdomain __declspec |
__declspec modificatore che impone che le variabili statiche e globali esistano per ogni dominio app. |
Cast di tipo C con /clr (C++/CLI) | Descrive come vengono interpretati i cast di tipo C. |
Convenzione di chiamata __clrcall | Indica la convenzione di chiamata conforme a CLR. |
__cplusplus_cli |
Macro predefinite |
Attributi personalizzati | Descrive come definire gli attributi CLR personalizzati. |
Gestione delle eccezioni | Fornisce una panoramica della gestione delle eccezioni. |
Override espliciti | Illustra come le funzioni membro possono eseguire l'override di membri arbitrari. |
Assembly di tipo friend (C++) | Illustra come un assembly client può accedere a tutti i tipi in un componente di assembly. |
Conversione boxing | Illustra le condizioni in cui i tipi di valori vengono sottoposti a boxing. |
Supporto del compilatore per tratti di tipo | Illustra come rilevare le caratteristiche dei tipi in fase di compilazione. |
Pragma managed, unmanaged | Illustra come le funzioni gestite e non gestite possono coesistere nello stesso modulo. |
modificatore di processo __declspec |
__declspec modificatore che impone che le variabili statiche e globali esistano per processo. |
Reflection (C++/CLI) | Illustra la versione CLR delle informazioni sul tipo di runtime. |
Stringa | Illustra la conversione del compilatore di valori letterali stringa in String. |
Inoltro del tipo (C++/CLI) | Consente lo spostamento di un tipo in un assembly di distribuzione a un altro assembly in modo che il codice client non debba essere ricompilato. |
Attributi definiti dall'utente | Illustra gli attributi definiti dall'utente. |
Direttiva #using | Importa gli assembly esterni. |
Documentazione di XML | Presenta la documentazione del codice basato su XML tramite /doc (elaborazione dei commenti per la documentazione) (C/C++) |
Vedi anche
Programmazione .NET con C++/CLI (Visual C++)
Interoperabilità .NET e nativa