C sharp

Da Wikipedia, l'enciclopedia libera.
(Reindirizzamento da C Sharp)
Nota disambigua.png
Il titolo di questa voce non è corretto per via delle caratteristiche del software MediaWiki. Il titolo corretto è C#.
bussola Disambiguazione – "C♯" rimanda qui. Se stai cercando la nota Do diesis, vedi Do (nota).
C#
C Sharp wordmark.svg
Autore Anders Hejlsberg
Data di origine 2000
Ultima versione 5.0
Utilizzo linguaggio general-purpose
Paradigmi Multi-Paradigma: Strutturata, Imperativa, Object-Oriented, Funzionale, a eventi
Tipizzazione Statica, Dinamica, Forte, Sicura,
Estensioni comuni .cs, .csproj
Influenzato da C++, Java, Eiffel, Haskell, ML
Ha influenzato D, F#, Java

Il C# (pronuncia: [ˈsiː ˈʃɑːp], come le parole inglesi "see sharp")[1] è un linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft all'interno dell'iniziativa .NET, e successivamente approvato come standard ECMA.

La sintassi del C# prende spunto sia da quella di Delphi (hanno il medesimo autore, ovvero Anders Hejlsberg), di C++, di Java e di Visual Basic per gli strumenti di programmazione visuale e per la sua semplicità. Il risultato è un linguaggio con meno simbolismo rispetto a C++, meno elementi decorativi rispetto a Java, ma comunque orientato agli oggetti in modo nativo.

Caratteristiche del linguaggio[modifica | modifica wikitesto]

C# è, in un certo senso, il linguaggio che meglio degli altri descrive le linee guida sulle quali ogni programma .NET gira; questo linguaggio infatti è stato creato da Microsoft specificatamente per la programmazione nel Framework .NET. I suoi tipi di dati "primitivi" hanno una corrispondenza univoca con i tipi .NET e molte delle sue astrazioni, come classi, interfacce, delegati ed eccezioni, sono particolarmente adatte a gestire il .NET framework.

Definire in forma classica il C# come linguaggio interpretato o compilato è piuttosto complicato e articolato. In effetti è ambedue le cose allo stesso tempo. Data appunto la sua stretta integrazione con il Framework .NET, i codici sorgente scritti in C# sono normalmente compilati secondo i criteri JIT: la trasformazione in codice macchina (ovvero eseguito direttamente dalla CPU) avviene su richiesta solo all'atto di caricamento ed esecuzione del programma. In prima istanza il codice sorgente viene convertito dal framework in un codice intermedio detto CIL e solo all'esecuzione del programma il CLR specifico per il sistema operativo utilizzato converte il CIL in codice macchina, man mano che viene eseguito. Una seconda possibilità è la cosiddetta compilazione Ngen, che permette di convertire tutto il codice CIL in codice macchina in una volta sola. Ciò ha il vantaggio di consentire l'implementazione di ambienti di sviluppo che utilizzino C# in qualunque sistema operativo, una volta implementato il CLR specifico.

Differenze con C e C++[modifica | modifica wikitesto]

Rispetto a C o a C++ il linguaggio C# ha subito una serie di modifiche, volte principalmente ad evitare errori tipici e ambiguità della programmazione C:

  • I puntatori possono essere utilizzati solo in particolari blocchi di codice marcati come "unsafe".
  • In molte operazioni aritmetiche vengono controllati eventuali "overflow".
  • Gli oggetti dinamici non vengono deallocati esplicitamente; la loro rimozione viene gestita automaticamente (e implicitamente) dal "garbage-collector" quando non esistono più riferimenti a tali oggetti. Questa gestione evita i due problemi ben noti dei dangling pointer e del memory leak, anche se con un'ovvia riduzione delle prestazioni.
  • Come in Java è possibile ereditare da una sola classe (diversamente da quanto avviene in C++) ma è possibile implementare un numero indefinito di interfacce. A differenza del C++, non è consentita l'ereditarietà "private" .
  • Le sole conversioni implicite consentite sono quelle "safe", ovvero che non espongono al rischio di perdita di dati causata dalla diversa tipologia di dato. Ad esempio non sono consentite conversioni implicite fra integer e boolean o fra enumerati ed integer.
  • C# non possiede i "template" (tipici del C++), ma nella versione 2.0 sono stati introdotti i "generic".

Differenze con Java[modifica | modifica wikitesto]

Sebbene C# sia ritenuto simile a Java, esistono alcune importanti differenze fra i due linguaggi. Quella maggiormente visibile è certamente la presenza in C# di molti costrutti (alcuni dei quali sono reminiscenze del C++) che in Java sono stati deliberatamente vietati. I sostenitori del C# affermano che essi rendono il codice più chiaro; i sostenitori del Java affermano che proprio la presenza di un gran numero di parole-chiave e di regole da ricordare rende il linguaggio più difficile da imparare e utilizzare.

Altre differenze sono le seguenti:

  • Java utilizza i commenti Javadoc-sintax per generare la documentazione dal codice sorgente, mentre C# utilizza la sintassi XML nei commenti per lo stesso scopo.
  • Quello che in Java è chiamato package, in C# viene chiamato namespace o "spazio di nomi". Un ulteriore livello di organizzazione in C# è costituito dagli "assembly", che possono contenere al proprio interno diversi spazi di nomi (class).

Nuove funzioni introdotte con la versione 3 del linguaggio[modifica | modifica wikitesto]

Nuove funzioni introdotte con la versione 4 del linguaggio[modifica | modifica wikitesto]

  • Pseudo tipo dynamic
  • Covarianza e Controvarianza nei tipi di parametri per interfacce generiche e delegati
  • Specifica ref opzionale per l'uso di COM
  • Parametri opzionali e nomi di argomenti
  • Indicizzatori di Proprietà (riconosciuti, ma non utilizzati dagli oggetti in C#)

Esempi[modifica | modifica wikitesto]

Hello world![modifica | modifica wikitesto]

Hello, world! Il seguente esempio stampa il testo "Hello world" su console.

  using System;
 
  class HelloWorldApp
  {
    public static void Main()
    {
      Console.WriteLine("Hello World");
    }
  }

Invece il seguente esempio stampa il testo "Hello world" su una Message Box.

  using System.Windows.Forms;
 
  class HelloWorldApp
  {
    public static void Main()
    {
      MessageBox.Show("Hello World");
    }
  }

Definizione di classe[modifica | modifica wikitesto]

Il seguente esempio definisce una classe di nome Persona che espone una proprietà Nome il cui valore viene memorizzato nella variabile mNome:

using System;
namespace Program
{
  class Persona 
  {
    private string mNome;
 
    public string Nome 
    {
      get { return mNome; }
      set { mNome = value; }
    }
  }				
}

Lo stesso esempio si può scrivere in una forma equivalente, utilizzando la sintassi delle "Automatic Properties" introdotta con la versione 3.0:

  using System;
  class Persona 
  {
    public string Nome { get; set; }
  }

Da notare che il linguaggio C# risulta essere uno strumento sintattico per l'utilizzo delle librerie presenti nei namespace del Framework .NET di Microsoft. A parte le strutture interne al linguaggio, il programmatore C# deve fare riferimento alle librerie, anche per la gestione dell'I/O, come del resto in C e C++. Nel primo esempio presentato infatti viene utilizzato il namespace System del quale sarà poi utilizzato il metodo WriteLine della classe Console per scrivere a video la scritta "Hello World".

Implementazioni[modifica | modifica wikitesto]

Il compilatore di riferimento è Microsoft Visual C#, parte del pacchetto Microsoft Visual Studio.

Esistono sul mercato e nei circuiti dell'open source altre implementazioni.

Mono[modifica | modifica wikitesto]

Il progetto Mono implementa un compilatore C# con licenza open source, un'implementazione completa open source del CLI, o Common Language Infrastructure, comprendente le librerie di framework richieste da specifiche ECMA, oltre a una quasi completa implementazione delle librerie di classi proprietarie di .NET attualmente aggiornate fino alle versione 3.5. Fino alla versione 2.6 di Mono non è prevista l'implementazione di Windows Presentation Foundation (WPF), sebbene sia invece prevista per successive evoluzioni della piattaforma Mono. Inoltre attualmente sono previste implementazioni solo parziali di LINQ to SQL e WCF.

DotGNU[modifica | modifica wikitesto]

Il progetto DotGNU include un compilatore C#, una implementazione quasi completa della CLI comprese le librerie richieste secondo le specifiche ECMA, oltre a un sottoinsieme di alcune librerie di classi .NET proprietarie di Microsoft, aggiornate fino alla versione .NET 2.0.

Standardizzazione[modifica | modifica wikitesto]

Nel dicembre del 2001 ECMA ha rilasciato "ECMA-334 C# Language Specification"[2].

C# è diventato uno standard ISO nel 2003 (ISO/IEC 23270)[3].

Esistono implementazioni indipendenti di .NET e del C#, fra cui il progetto Mono di Ximian e dotGNU & Portable.NET della Free Software Foundation.

Microsoft ha introdotto, a partire dalla versione 2.0 del framework, i "generics", le "partial-class" oltre a varie altre funzionalità. È stata proposta la standardizzazione ECMA/ISO anche per queste funzionalità, ma allo stato attuale non fanno parte della definizione standard del linguaggio.

Note[modifica | modifica wikitesto]

  1. ^ Il nome gioca sul fatto che C♯, in inglese e altre lingue, indica la nota musicale Do diesis, un semitono sopra il "C", ovvero il Do (fonte: James Kovacs, C#/.NET History Lesson, 7 settembre 2007. URL consultato il 7 giugno 2012.). In effetti, il nome del linguaggio andrebbe scritto con il simbolo del diesis, ma in sostituzione si usa il cancelletto per praticità di scrittura (fonte: MSDN, Domande frequenti su Visual C#). In italiano, il gioco di parole viene perso.
  2. ^ Standard ECMA-334
  3. ^ http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=36768 - Standardizzazione ISO

Bibliografia[modifica | modifica wikitesto]

Altri progetti[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]