C# per sviluppatori C++
Aggiornamento: novembre 2007
Nella tabella riportata di seguito viene effettuato un confronto tra il linguaggio C# e il linguaggio C++ nativo, in cui non viene utilizzata l'opzione /clr. Per i programmatori C++ questa tabella evidenzia le più importanti differenze tra i due linguaggi.
Nota: |
---|
I progetti C++ e C# sono derivati da modelli di progetto differenti. Per ulteriori informazioni sulle differenze tra i progetti C++ e C#, vedere Gestione di elementi nei progetti e Utilizzo di Esplora soluzioni. |
Funzionalità |
Argomento di riferimento |
---|---|
Ereditarietà. In C++ le classi e le strutture sono praticamente identiche mentre in C# sono differenti. Le classi C# possono implementare un qualsiasi numero di interfacce, ma possono ereditare da una sola classe base. Inoltre, le strutture C# non supportano l'ereditarietà né i costruttori predefiniti espliciti (un costruttore di questo tipo viene fornito per impostazione predefinita). |
|
Matrici. In C++ una matrice è semplicemente un puntatore, mentre in C# è un oggetto che include metodi e proprietà. Ad esempio, la dimensione di una matrice può essere determinata tramite la proprietà Length. Le matrici C# utilizzano inoltre indicizzatori che verificano ciascun indice utilizzato per accedere alla matrice. La sintassi per la dichiarazione delle matrici C# è diversa da quella delle matrici C++. In C# i token "[]" non vengono visualizzati dopo la variabile bensì dopo il tipo della matrice. |
|
Valori booleani. In C++ il tipo bool è essenzialmente un integer. In C# non viene eseguita alcuna conversione tra il tipo bool e gli altri tipi. |
|
Tipo long. In C# il tipo long è a 64 bit, mentre in C++ è a 32 bit. |
|
Passaggio dei parametri. In C++ tutte le variabili vengono passate per valore, a meno che non siano passate esplicitamente con un puntatore o un riferimento. In C# le classi vengono passate per riferimento e le strutture per valore, a meno che non siano passate esplicitamente per riferimento utilizzando i modificatori di parametro ref o out. |
|
Istruzione switch. A differenza dell'istruzione switch di C++, in C# non è supportato il passaggio da un'etichetta case a un'altra. |
|
Delegati. I delegati di C# sono abbastanza simili ai puntatori a funzione disponibili in C++, con la differenza che sono indipendenti dai tipi e protetti. |
|
Metodi della classe base. In C# è supportata la parola chiave base che consente di chiamare i membri della classe base sottoposti a override dalle classi derivate. Inoltre, in C# è possibile eseguire esplicitamente l'override dei metodi virtuali o astratti utilizzando la parola chiave override. |
Vedere inoltre gli esempi illustrati per override |
Esclusione dei metodi. In C++ è possibile nascondere un metodo in modo implicito mediante l'ereditarietà. In C# è necessario utilizzare il modificatore new per nascondere esplicitamente i membri ereditati. |
|
Per la compilazione condizionale vengono utilizzate le direttive per il preprocessore. In C# non vengono utilizzati file di intestazione. |
|
Gestione delle eccezioni. In C# è possibile utilizzare la parola chiave finally per specificare un codice che deve essere eseguito indipendentemente dal fatto che venga generata un'eccezione. |
|
Operatori C#. In C# sono supportati operatori aggiuntivi quali is e typeof. Sono state inoltre introdotte funzionalità differenti per alcuni operatori logici. |
|
Parola chiave typedef. In C++, typedef viene utilizzata per creare nomi più brevi o più pratici per i tipi già dichiarati. In C#, questa funzionalità è fornita dalla direttiva using. |
|
Parola chiave extern. In C++ la parola chiave extern viene utilizzata per importare i tipi. In C#, invece, la parola chiave extern viene utilizzata per creare alias e consentire l'utilizzo di versioni differenti dello stesso assembly. |
|
Parola chiave static. In C++ la parola chiave static può essere utilizzata sia per dichiarare entità a livello di classe che per dichiarare tipi specifici per un modulo. In C#, invece, la parola chiave static viene utilizzata solo per dichiarare entità a livello di classe. |
|
In C# il metodo Main viene dichiarato in modo differente rispetto alla funzione main di C++. In C# questo metodo viene scritto in lettere maiuscole ed è sempre static. Inoltre, il supporto per l'elaborazione degli argomenti della riga di comando è molto più efficiente in C#. |
Main() e gli argomenti della riga di comando (Guida per programmatori C#) |
I puntatori sono consentiti in C#, ma solo in modalità unsafe. |
|
L'overload degli operatori viene eseguito in modo differente in C#. |
|
Stringhe. In C++ una stringa è semplicemente una matrice di caratteri. In C#, invece, le stringhe sono oggetti che supportano metodi di ricerca avanzati. |
|
La parola chiave foreach consente di scorrere il contenuto delle matrici e degli insiemi. |
|
Globali. In C# i metodi e le variabili globali non sono supportati. I metodi e le variabili devono essere contenuti all'interno di una parola chiave class o struct. |
|
Direttiva per il preprocessore #define: in C++ la direttiva #define viene generalmente utilizzata per dichiarare valori costanti. In C# non è possibile utilizzare la direttiva #define per questo scopo. Le costanti in C# possono essere definite come tipi enumerati (solo valori integrali) o come membri statici di una classe o di una struttura. Se sono presenti più costanti, può essere utile creare una classe di costanti separata per utilizzarle. |
|
Importazione dei tipi. In C++ i tipi comuni a più moduli vengono inseriti nei file di intestazione. In C#, invece, queste informazioni sono disponibili tramite metadati. |
|
Non è possibile utilizzare variabili locali in C# senza averle inizializzate. |
|
Gestione della memoria. In C++ non è prevista l'esecuzione della Garbage Collection. La memoria non rilasciata esplicitamente rimane allocata finché il processo non termina. In C#, invece, viene eseguita la Garbage Collection. |
|
Distruttori. In C# è prevista una sintassi differente per il rilascio in modo deterministico delle risorse non gestite. |
|
Costruttori. Analogamente a quanto avviene in C++, se in C# non si fornisce un costruttore di classe, viene generato automaticamente un costruttore predefinito che inizializza tutti i campi in base al relativo valore predefinito. |
|
In C# i campi di bit non sono supportati. |
|
La formattazione e i servizi di input/output di C# si basano sulla libreria di runtime di .NET Framework. |
|
In C# i parametri di metodo non possono avere valori predefiniti. Utilizzare gli overload dei metodi se si desidera ottenere lo stesso effetto. |
|
In C# vengono forniti tipi e metodi generici che consentono di eseguire la parametrizzazione dei tipi in modo simile ai modelli C++. Esistono tuttavia differenze significative. Ad esempio, in C# le informazioni sui tipi generici vengono mantenute in fase di esecuzione. |
|
La parola chiave as è simile a un cast standard, con la differenza che, in caso di errore durante la conversione, anziché generare un'eccezione viene restituito il valore null. Questo comportamento è simile a quello della parola chiave static_cast in C++ che, a differenza di dynamic_cast, non esegue alcun controllo in fase di esecuzione e non genera quindi un'eccezione in caso di errore. |
Per ulteriori informazioni sulle differenze tra le parole chiave in C# e negli altri linguaggi di programmazione, vedere Equivalenti di linguaggio. Per informazioni sulla struttura generale delle applicazioni C#, vedere Struttura generale di un programma C# (Guida per programmatori C#).