Nonostante le dichiarazioni di Microsoft, il C# ( si pronuncia see sharp ), è molto più vicino al C++ rispetto al Visual Basic. L’intento era quello di mascherare alcuni aspetti della programmazione C++ che costringono lo sviluppatore ad occuparsi di aspetti a basso livello, il tutto ovviamente senza perdere la potenza del linguaggio C++. A supportare questa teoria è il fatto che la maggior parte del .NET framework è stata scritta in C#, ma andiamo con ordine e vediamo le caratteristiche di questo linguaggio.
Una delle prime cose che risaltano nella definizione di questo linguaggio è la semplificazione della sintassi rispetto al C++, ad esempio esiste soltanto un operatore per lavorare con i membri di una classe, struttura o unione, il punto. Sempre nell’ottica della semplificazione del codice è stata eliminata la necessità di specificare l’inclusione degli header delle diverse librerie di sistema ed è stata introdotta la possibilità di fare riferimento alle classi che implementano determinate funzioni. Ad esempio, invece di scrivere:
#include <stdio.h>
#include <stdlib.h>
è possibile far riferimento al namespace di sistema:
using System;
e possiamo così scrivere:
Console.WriteLine(“Ciao Mondo\n”);
Naturalmente la creazione e l’uso di namespace si estende anche al codice scritto dallo sviluppatore, che in questo modo può riutilizzare il codice prodotto.
Il linguaggio C# introduce anche alcune novità riguardo ai tipi di dato, innanzitutto aderisce al CTS ( Common Type System ) del .NET che ogni linguaggio per questa piattaforma deve supportare. Il C++ classico non è compatibile con la piattaforma .NET e per questo Microsoft ha rilasciato le Managed Extensions for C++ per consentire l’uso di questo linguaggio nel .NET framework. Ad esempio il tipo booleano non è più un tipo numerico, ma un tipo autonomo e sono stati introdotti altri tipi nativi come string e decimal ed esiste un solo tipo char di 16 bit. Oltre a questo, il compilatore inizializza automaticamente le variabili ed è stato introdotto il controllo automatico sull’indice degli array, più volte sorgente di errori per i programmatori C++. Per semplificare ulteriormente il lavoro sugli array è stata introdotta l’istruzione foreach analoga a quella di Visual Basic, possiamo così scrivere:
int[] arrVal = { 4, 56, 76, 3, 54 }; foreach (int i in arrVal) Console.WriteLine("Il valore è: " + i);
Il linguaggio C# è pienamente orientato agli oggetti, qualsiasi tipo di dato può essere trattato come una classe, sono state mantenute funzionalità come ereditarietà, incapsulamento, polimorfismo ed è stata abbandonata l’ereditarietà multipla. Sono stati abbandonati i concetti di funzioni, variabili e costanti globali in favore dell’uso di membri di classi statiche, infine sono stati sostiuiti i puntatori a funzioni del C++ con i delegates.
Altra rivoluzione importante è l’introduzione del garbage collector che libera il programmatore C++ dal dover gestire direttamente l’allocazione della memoria. Per la gestione degli errori i due linguaggi hanno mantenuto lo stesso approccio, mentre è stato introdotto l’uso del costrutto conditional che consente di eliminare l’uso delle direttive del preprocessore che spesso rendevano illegibile il codice.
C# è fortemente integrato in COM, tanto che ciascun oggetto C# è automaticamente un oggetto COM, infatti non è necessario implementare esplicitamente l’interfaccia IUnknown dato che viene fatto direttamente dal sistema. Anche per utilizzare componenti COM esterni è stata introdotta la parola chiave new, che equivale alla funzione CoCreateInstance().
Tuttavia C# consente anche una retrocompatibilità con il C++, infatti è permesso dichiarare specifici blocchi come unsafe, utilizzare i puntatori ed array nel modo tradizionale ed utilizzare funzioni per la gestione della memoria, in questo modo gli sviluppatori C++ potranno mantenere alcune loro abitudini anche con il C#.