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).

classe

interfaccia

struct (Riferimenti per C#)

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.

Matrici (Guida per programmatori C#)

Indicizzatori (Guida per programmatori C#)

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.

bool

Tipo long. In C# il tipo long è a 64 bit, mentre in C++ è a 32 bit.

long

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.

struttura

classe

ref (Riferimenti per C#)

out (Riferimenti per C#)

Istruzione switch. A differenza dell'istruzione switch di C++, in C# non è supportato il passaggio da un'etichetta case a un'altra.

switch

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.

delegato

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.

base

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.

new

Per la compilazione condizionale vengono utilizzate le direttive per il preprocessore. In C# non vengono utilizzati file di intestazione.

Direttive per il preprocessore C#

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.

try-finally

try-catch-finally

Operatori C#. In C# sono supportati operatori aggiuntivi quali is e typeof. Sono state inoltre introdotte funzionalità differenti per alcuni operatori logici.

Operatore &

Operatore |

Operatore ^

is

typeof

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.

Direttiva using (Riferimenti per C#)

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.

extern

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.

static

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.

unsafe

L'overload degli operatori viene eseguito in modo differente in C#.

Operatori di C#

Stringhe. In C++ una stringa è semplicemente una matrice di caratteri. In C#, invece, le stringhe sono oggetti che supportano metodi di ricerca avanzati.

stringa

String

La parola chiave foreach consente di scorrere il contenuto delle matrici e degli insiemi.

foreach, in

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.

Struttura generale di un programma in linguaggio C#

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.

static (Riferimenti per C#)

const (Riferimenti per C#)

enum (Riferimenti per C#)

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.

using

Cenni preliminari sui metadati

Non è possibile utilizzare variabili locali in C# senza averle inizializzate.

Metodi (Guida per programmatori C#)

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.

Garbage Collection

Distruttori. In C# è prevista una sintassi differente per il rilascio in modo deterministico delle risorse non gestite.

Distruttori

Istruzione using (Riferimenti per C#)

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.

Costruttori di istanza

Tabella dei valori predefiniti

In C# i campi di bit non sono supportati.

Campi di bit C++

La formattazione e i servizi di input/output di C# si basano sulla libreria di runtime di .NET Framework.

Introduzione al linguaggio C#

Tabella della formattazione dei risultati numerici

In C# i parametri di metodo non possono avere valori predefiniti. Utilizzare gli overload dei metodi se si desidera ottenere lo stesso effetto.

Errore di compilazione CS0241

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.

Generics in C#

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.

as (Riferimenti per C#)

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#).

Vedere anche

Concetti

Guida per programmatori C#

Gestione degli elementi nei progetti

Utilizzo di Esplora soluzioni