C++/CLI: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m - cat inesistenti |
m Bot: standardizzazione nome sezione e modifiche minori |
||
Riga 2:
'''C++/CLI''' ([[C++]] modificato per la [[Common Language Infrastructure]]) è un [[linguaggio di programmazione]] specifico creato da Microsoft e destinato a sostituire le [[Managed extensions per C++]]. Si tratta di una revisione completa che mira a semplificare la vecchia sintassi del Managed C++, ora deprecato.<ref>[http://msdn.microsoft.com/en-us/library/b23b94s7.aspx Managed Extensions for C++ Syntax Upgrade Checklist - MSDN Library]</ref> C++/CLI è stato standardizzato da [[ECMA International|Ecma]] come '''ECMA-372'''. È disponibile in [[Microsoft Visual Studio|Visual Studio]] 2005, 2008, 2010, 2012, 2013 e 2015, incluse le versioni Express.
== Cambiamenti sintattici ==
C++/CLI è concepito come un linguaggio a sé stante, (ad esempio con un nuovo insieme di parole chiave), a differenza del Managed C++ (MC++), che è piuttosto un ''superset'' del C++ in cui le parole chiave non standard erano identifcate con <code>__gc</code> o <code>__value</code>. Di conseguenza, introduce alcune importanti modifiche sintattiche, legate principalmente all'eliminazione di identificatori ambigui e all'aggiunta di funzionalità specifiche NET.
Riga 10:
===Handles===
In MC++, vi erano due diversi tipi di [[Puntatore (programmazione)|puntatori]]: i puntatori <code>__nogc</code>, essenzialmente ordinari puntatori C++, e i puntatori <code>__gc</code>, usati per i tipi di riferimento .NET. Nel C++/CLI, invece, l'unico tipo di puntatore è il normale puntatore
===Rintracciamento di riferimenti===
Un '''rintracciamento di riferimenti''' (anche detto tracking references) in C++/CLI è un handle di una variabile passata per riferimento. Come concetto è simile all'utilizzo di <code>*&</code> (riferimento a un puntatore) nel C++ classico, e (nella dichiarazione di funzioni) corrisponde alla parola chiave <code>ref</code> applicata a tipi in C#, o <code> ByRef </code> in .NET. Per indicare un rintracciamento di riferimento il C++/CLI utilizza come sintassi <code>^%</code>.
Un esempio sull'utilizzo del 'rintracciamento di riferimenti' viene mostrato nel codice che segue. Rimpiazzare il rintracciamento di riferimenti con un handle regolare lascerebbe l'array di stringhe risultante con 10 stringhe handles non inizializzate, in quanto sarebbero impostate solamente le stringhe handle nell'array, dato che vengono passate per valore e non per riferimento.
<source lang=Cpp>
Riga 37:
Un'ulteriore differenza con C++/CLI è l'introduzione sintattica di [[finalizzatori]] <code>!ClassName</code>, un tipo speciale di distruttore non deterministico eseguito come parte della [[Garbage collection (computer science)|garbage collection routine]]. La sintassi dei distruttori classica del C++, quale <code>~ClassName()</code>, esiste anche per oggetti gestiti, e riflette meglio la semantica "tradizionale" del C++ di una distruzione deterministica (di fatto i distruttori possono essere invocati a livello di codice mediante <code> delete </code>.
Nel paradigma .NET naturale, il modello di distruzione non deterministico annulla il metodo protetto <code>Finalize</code> della classe root <code>Object</code>; mentre il modello determinstico è implementato attraverso il metodo <code>Dispose</code> dell'[[interfaccia]] <code>IDisposable</code> (che il compilatore C++/CLI trasforma in un distruttore). Oggetti provenienti da C# o VB.NET, che annullano il metodo Dipose, possono essere posti manualmente in C++/CLI mediante <code>delete</code>, esattamente come le classi .NET in C++/CLI.
<source lang=Cpp>
Riga 74:
s1 == s2; // true, perché riferiscono allo stesso oggetto
o1 == o2; // false, perché non sono lo stesso oggetto
</source>
==C++/CX==
Il nuovo [[C++/CX]] con l'obiettivo di [[WinRT]], sebbene produca interamente codice "unmanaged", prende in prestito il concetto di ref e la sintassi ^ per la referenza sul conteggio delle componenti di WinRT, che sono simili agli oggetti [[Component Object Model|COM]].
==Note==
<references />
==
* [http://www.ecma-international.org/publications/standards/Ecma-372.htm ECMA 372: C++/CLI Language Specification]
* [[Herb Sutter]]: [http://blogs.msdn.com/hsutter/archive/2003/11/23/53519.aspx C++/CLI keywords: Under the hood]
|