Loading AI tools
linguaggio di programmazione orientato agli oggetti Da Wikipedia, l'enciclopedia libera
Il C# (pronuncia inglese: [ˈsiː ˈʃɑːp], come l'espressione see sharp, "vedere nitidamente")[1] è un linguaggio di programmazione multi-paradigma che supporta tutti i concetti della programmazione orientata agli oggetti. Esso è stato sviluppato da Microsoft all'interno dell'iniziativa .NET, e successivamente approvato come standard dalla ECMA (ECMA-334) e ISO (norma ISO/IEC 23270).
C# linguaggio di programmazione | |
---|---|
Autore | Anders Hejlsberg |
Data di origine | 2000 |
Ultima versione | 13.0 (12 novembre 2024) |
Utilizzo | Generico |
Paradigmi | Multi-paradigma: Strutturata, Imperativa, Object-Oriented, Funzionale, a eventi |
Tipizzazione | Statica, Dinamica, Forte, Sicura |
Estensioni comuni | .cs, .csproj |
Influenzato da | Delphi, C++, Java, Eiffel, Haskell, ML |
Ha influenzato | D, F#, Java, TypeScript |
Implementazione di riferimento | |
Sito web | docs.microsoft.com/en-us/dotnet/csharp/, docs.microsoft.com/de-de/dotnet/csharp/, docs.microsoft.com/ja-jp/dotnet/csharp/, docs.microsoft.com/fr-fr/dotnet/csharp/ e docs.microsoft.com/it-it/dotnet/csharp/ |
La sintassi e struttura del C# prendono spunto da vari linguaggi nati precedentemente, in particolare Delphi, C++, Java e Visual Basic.
Il progettista principale di C# è Anders Hejlsberg, un informatico danese precedentemente coinvolto nello sviluppo dei linguaggi Turbo Pascal e Borland Delphi (attualmente di proprietà di Embarcadero).
È opinione comune che l'ispirazione venne dal linguaggio Java, dato che perfino il suo ideatore James Gosling, nonché Bill Joy di Sun Microsystem, lo definirono una sua imitazione, ma più limitata dal punto di vista della affidabilità, sicurezza e produttività[2]. Invece, secondo Anders Hejlsberg e Microsoft stessa, la struttura di C# è più vicina a quella del linguaggio C++ piuttosto che a Java[3].
C# è strettamente legato allo sviluppo di .NET Framework. Infatti gli ingegneri di Microsoft utilizzarono nelle prime fasi della sua stesura un framework chiamato SMC, ovvero Simple Managed C, un sistema utilizzante il linguaggio C in modo gestito o "managed". Nel gennaio 1999, Microsoft mise Anders Hejlsberg a capo di un gruppo di lavoro con il compito di produrre un nuovo linguaggio, chiamato provvisoriamente "Cool", acronimo di "C-like Object Oriented Language" (linguaggio orientato agli oggetti simile a C)[4]. Il nome commerciale definitivo divenne C# alla presentazione ufficiale del progetto .NET da parte di Microsoft alla Professional Developers Conference tenutasi nel luglio 2000 a Orlando, quando anche le librerie di classi e il runtime di ASP.NET vennero convertite in linguaggio C#.
Nel tempo C# e Java hanno percorso strade differenti, aumentando complessivamente le differenze reciproche, sebbene ci siano stati anche evidenti casi di reciproco scambio di caratteristiche. Per esempio C#, a differenza di Java, utilizza sin dalla versione 2 la reificazione per generare oggetti generici che possono essere usati come classi, riservando al momento del caricamento della classe in fase di esecuzione la compilazione effettiva del codice. Anche l'implementazione in ambedue i linguaggi dei tipi generici, sebbene concettualmente identica, è stata implementata in maniera piuttosto differente. Invece, il concetto di boxing e unboxing propri di C# sono stati implementati successivamente anche in linguaggio Java[5].
La versione C# 1.0, basata su .NET Framework 1.0, fu pubblicata commercialmente da Microsoft nel gennaio 2002 con il pacchetto di sviluppo Visual Studio .NET 2002. In seguito sono state pubblicate sino ad oggi nuove versioni del linguaggio e del framework .NET con i pacchetti Microsoft Visual Studio. [6]
Versione C# | Data di presentazione | Versione .NET | Visual Studio |
---|---|---|---|
1.0 | gennaio 2002 | 1.0 | Visual Studio .NET 2002 |
2.0 | novembre 2005 | 2.0 | Visual Studio .NET 2003 |
3.0 | novembre 2007 | 2.0/3.5 | Visual Studio 2008-2010 |
4.0 | aprile 2010 | 4.0 | Visual Studio 2010 |
5.0 | agosto 2012 | 4.5 | Visual Studio 2012-2013 |
6.0 | luglio 2015 | 4.6 | Visual Studio 2015 |
7.0 | marzo 2017 | 4.6.2 | Visual Studio 2017 |
7.1 | agosto 2017 | 4.7 | Visual Studio 2017 Ver. 15.3 |
7.2 | novembre 2017 | 4.7.1 | Visual Studio 2017 Ver. 15.5 |
7.3 | maggio 2018 | 4.7.2 | Visual Studio 2017 Ver. 15.7 |
8.0 | settembre 2019 | 4.8 | Visual Studio 2019 |
9.0 | settembre 2020 | 5 | Visual Studio 2019 |
10.0 | novembre 2021 | 6 | Visual Studio 2022 |
11.0 | novembre 2022 | 7 | Visual Studio 2022 |
12.0 | novembre 2023 | 8 | Visual Studio 2022 |
C# è, in un certo senso, il linguaggio che meglio degli altri descrive le linee guida sulle quali ogni programma .NET gira. 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. È divenuto quindi il linguaggio ordinario per realizzare software in ambiente Windows.
Definire in forma classica C# come linguaggio interpretato o compilato nel senso classico dei termini è piuttosto complicato. In effetti è ambedue le cose allo stesso tempo. Data la sua stretta integrazione con il Framework .NET, i codici sorgente scritti in C# sono normalmente compilati secondo i criteri JIT. In pratica, la trasformazione in codice macchina (ovvero eseguito direttamente dalla CPU) viene compiuta 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 linguaggio macchina specifico per l'hardware ospite, man mano che viene eseguito. Ciò comporta che l'esecuzione del codice può risultare più lenta alla prima esecuzione diventando poi più veloce. Inoltre, vengono tipicamente svolte durante la compilazione stessa delle ottimizzazioni progressive del codice macchina, producendo così un codice eseguito più velocemente e teoricamente "ottimale" solo dopo alcune esecuzioni complete dello stesso.
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.
La sintassi di base del C# è spesso molto simile o identica a quella dei linguaggi C, C++ e Java. Alcune delle caratteristiche di base sono:
Rispetto a C o a C++ il linguaggio C# presenta varie modifiche, volte principalmente ad evitare errori tipici e ambiguità della programmazione in linguaggio C:
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 chiaramente derivati dal C++, che in Java sono stati deliberatamente vietati. I sostenitori del C# affermano che tutto ciò rende il codice più chiaro, mentre i sostenitori di 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 evidenti sono le seguenti:
Il seguente esempio visualizza il testo "Hello world" su console.
using System;
class HelloWorldApp
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World");
Console.ReadLine ();
}
}
Invece il seguente esempio stampa il testo "Hello world" in una Message Box.
using System.Windows.Forms;
class HelloWorldApp
{
public static void Main()
{
MessageBox.Show("Hello World");
}
}
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;//se non specifico "private" non ci sono differenze, perché è sottinteso.
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 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++. Infatti, nel primo esempio presentato viene utilizzato il namespace System del quale sarà poi utilizzato il metodo WriteLine della classe Console per scrivere a video la scritta "Hello World".
Questo esempio mostra una semplice calcolatrice.
using System;
namespace Calcolatrice
{
class Program
{
static void Main(string[] args)
{
int Numero1 = 0, Numero2 = 0; // Dichiara due numeri e li inizializza a 0.
int Risultato; // Variabile che serve per il risultato dei due numeri.
char Scelta; // Scelta dell'utente riferito alle opzioni nel menù.
do
{
Console.Clear(); // Cancella tutte le scritte presenti nella console.
/* Menù */
Console.WriteLine("Benvenuto nella calcolatrice."); // Scrive nella console "Benvenuto nella calcolatrice.".
Console.WriteLine("1. Addizione"); // Scrive nella console "1. Addizione".
Console.WriteLine("2. Sottrazione"); // Scrive nella console "2. Sottrazione".
Console.WriteLine("3. Moltiplicazione"); // Scrive nella console "3. Moltiplicazione".
Console.WriteLine("4. Divisione"); // Scrive nella console "4. Divisione".
Console.WriteLine("5. Esci"); // Scrive nella console "5. Esci".
Scelta = Console.ReadKey().KeyChar; // L'opzione dell'utente viene memorizzata nella variabile "Scelta"
Console.Clear(); // Cancella tutte le scritte presenti nella console.
if(Scelta != '5')
{
Console.Write("Inserisci il Primo numero: "); // Chiede all'utente di inserire il primo numero.
Numero1 = Convert.ToInt32(Console.ReadLine()); // Assegna il primo numero inserito dall'utente alla variabile "Numero1".
Console.Write("Inserisci il secondo numero: "); // Chiede all'utente di inserire il secondo numero.
Numero2 = Convert.ToInt32(Console.ReadLine()); // Assegna il secondo numero inserito dall'utente alla variabile "Numero2".
}
switch(Scelta) // Con lo switch si analizzano i vari casi del valore della variabile.
{
case '1':
{
Risultato = Numero1 + Numero2; // Il risultato dell'addizione va a finire dentro alla variabile "Risultato".
Console.WriteLine(Numero1 + " + " + Numero2 + " = " + Risultato); // Dice all'utente il risultato.
break; // Termina subito lo switch per non fare anche gli altri casi
}
case '2':
{
Risultato = Numero1 - Numero2; // Il risultato della sottrazione va a finire dentro alla variabile "Risultato".
Console.WriteLine(Numero1 + " - " + Numero2 + " = " + Risultato); // Dice all'utente il risultato.
break; // Termina subito lo switch per non fare anche gli altri casi
}
case '3':
{
Risultato = Numero1 * Numero2; // Il risultato della moltiplicazione va a finire dentro alla variabile "Risultato".
Console.WriteLine(Numero1 + " * " + Numero2 + " = " + Risultato); // Dice all'utente il risultato.
break; // Termina subito lo switch per non fare anche gli altri casi
}
case '4':
{
if (Numero2 != 0) // La divisione per zero è impossibile quindi si aggiunge un if
{
Risultato = Numero1 / Numero2; // Il risultato della divisione va a finire dentro alla variabile "Risultato".
Console.WriteLine(Numero1 + " / " + Numero2 + " = " + Risultato); // Dice all'utente il risultato.
}
else
{
Console.WriteLine(Numero1 + " / " + Numero2 + " = Impossibile!"); // Risultato impossibile
}
break; // Termina subito lo switch per non fare anche gli altri casi
}
case '5':
{
break; // Termina subito lo switch per non fare anche gli altri casi
}
default:
{
Console.WriteLine("Opzione Errata");
break;
}
}
Console.WriteLine("Premere invio per andare avanti");
Console.ReadKey();
}
while (Scelta != '5'); // Se la condizione è vera il codice al suo interno viene rieseguito!
}
}
}
Il compilatore di riferimento è Microsoft Visual C#, parte del pacchetto Microsoft Visual Studio e attualmente open source[13].
Esistono sul mercato e nei circuiti dell'open source altre implementazioni.
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 alla 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.
Il progetto DotGNU, attualmente non più supportato[14], include un compilatore C#, una implementazione parziale della CLI, comprese le librerie richieste secondo le specifiche ECMA, oltre a un sottoinsieme di alcune librerie di classi .NET proprietarie di Microsoft, aggiornate alla versione .NET 2.0.
Il progetto Rotor di Microsoft, distribuito con licenza gratuita solo per scopi didattici e di ricerca, fornisce una implementazione del runtime CLR e un compilatore C#, con un sottoinsieme dell'infrastruttura CLI conforme alle specifiche ECMA[15].
Nel dicembre del 2001 ECMA ha pubblicato "ECMA-334 C# Language Specification"[16].
C# è diventato uno standard ISO nel 2003 (ISO/IEC 23270)[17].
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.