Il classico primo programma stampa una riga di testo. In C# è così:
Output:
Hello, World!
Riga per riga
using System;ti permette di scrivereConsoleinvece del nome completoSystem.Console.Consoleè una classe del namespaceSystem(vedi namespace e using).class Programdichiara una classe. Tutto il codice C# sta dentro un tipo; il nomeProgramè una convenzione, non un obbligo.static void Main()è il punto di ingresso. All'avvio del programma, il runtime cerca un metodo statico chiamatoMaine lo chiama.staticsignifica che appartiene alla classe stessa, quindi non serve creare prima un oggetto.voidsignifica che non restituisce niente.Console.WriteLine("Hello, World!");chiama il metodoWriteLinecon un argomento stringa. Ogni istruzione termina con un punto e virgola.- Le graffe
{ }delimitano il corpo della classe e del metodo.
C# distingue tra maiuscole e minuscole. console.writeline e main sono nomi diversi da Console.WriteLine e Main, e nessuno dei due esiste.
Console.WriteLine e Console.Write
WriteLine aggiunge un a capo dopo il testo. Write no, quindi l'output successivo continua sulla stessa riga. Entrambi accettano qualsiasi tipo, non solo stringhe: numeri, booleani e oggetti vengono convertiti con il loro metodo ToString().
Output:
Loading.. done
42
True
Item: coffee
coffee costs 3.20
coffee costs 3.20
Nota che true viene stampato come True: è quello che restituisce bool.ToString(). La forma $"...", chiamata interpolazione di stringhe, è quella che userai di più; vedi interpolazione di stringhe per i codici di formato come :F2.
Leggere l'input con Console.ReadLine
Console.ReadLine() aspetta che l'utente scriva una riga e prema Invio, poi restituisce quella riga come string senza l'a capo. Alla fine dell'input (per esempio quando l'input è rediretto da un file che è finito) restituisce null.
Output:
What is your name? How old are you?
Hi Maya, next year you will be 28.
Quando lo esegui in un terminale, il testo che scrivi compare dopo ogni richiesta. L'output qui sopra non contiene testo digitato perché l'input è stato rediretto (passato tramite pipe) invece che digitato, quindi compare solo quello che scrive il programma.
ReadLine restituisce sempre testo. Per usare il valore come numero devi convertirlo. int.Parse(text) lancia una FormatException quando il testo non è un numero; int.TryParse invece restituisce false, ed è per questo che è la scelta giusta per l'input dell'utente. I dettagli sono in conversione di tipo.
Due metodi collegati: Console.Read() restituisce il carattere successivo come codice int, e Console.ReadKey() legge la pressione di un singolo tasto senza aspettare Invio (funziona solo in un terminale interattivo).
Le altre forme del metodo Main
Main può ricevere gli argomenti della riga di comando e può restituire un codice di uscita. Questi sono tutti punti di ingresso validi:
static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main() // C# 7.1 and later
static async Task<int> Main(string[] args) // C# 7.1 and later
Un int restituito diventa il codice di uscita del processo, che script e sistemi di CI leggono per capire se il programma è andato a buon fine (per convenzione 0 significa successo).
Output:
Got 0 argument(s)
Eseguilo con dotnet run -- apples pears e args conterrà "apples" e "pears". Il -- separa gli argomenti per il tuo programma da quelli per lo strumento dotnet.
Commenti
C# ha tre tipi di commenti. Il compilatore li ignora tutti.
// A single-line comment runs to the end of the line.
/* A block comment
can span several lines. */
/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;
Usa // per le note dentro il codice. I commenti /// vanno sui tipi e sui membri pubblici; l'IDE li mostra quando passi il mouse su una chiamata, e il compilatore può esportarli in un file XML per gli strumenti di documentazione.
Creare ed eseguire un progetto con dotnet
Sulla tua macchina, installa il .NET SDK da dotnet.microsoft.com, poi:
dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!
dotnet new console crea due file: HelloApp.csproj (il file di progetto: framework di destinazione, impostazioni, riferimenti ai pacchetti) e Program.cs. dotnet run compila il progetto e lo esegue. dotnet build compila senza eseguire e scrive l'output in bin/Debug/net8.0/ (il nome della cartella segue il tuo framework di destinazione).
Istruzioni di primo livello (C# 9 e successivi)
Apri il Program.cs generato e troverai questo, e nient'altro:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Questo è un programma con istruzioni di primo livello (top-level statements), una funzionalità di C# 9. Il compilatore genera la classe Program e il metodo Main attorno alle tue istruzioni. Manca anche using System; perché i progetti .NET 6 e successivi attivano gli using impliciti: i namespace comuni come System, System.IO, System.Linq e System.Collections.Generic sono importati per tutto il progetto.
I programmi con istruzioni di primo livello possono comunque leggere args, usare await e restituire un codice di uscita con return:
// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;
Solo un file per progetto può contenere istruzioni di primo livello, e i tipi (classi, record) devono venire dopo di esse. L'annotazione string? è un tipo riferimento nullable (C# 8), ed è lì perché ReadLine può restituire null. La forma esplicita class Program usata negli esempi di questa pagina è equivalente ed è quella che troverai nel codice più vecchio e nella maggior parte degli script Unity, quindi vale la pena saperle leggere entrambe. Passa --use-program-main a dotnet new console se nei nuovi progetti preferisci la forma esplicita.
I primi errori che vedrai
- CS1002: ; expected. A un'istruzione manca il punto e virgola. L'errore viene segnalato alla fine della riga in cui manca.
- CS0103: The name 'console' does not exist in the current context. Maiuscole sbagliate, oppure manca
using System;in un progetto senza using impliciti. - CS5001: Program does not contain a static 'Main' method suitable for an entry point.
Mainè scritto male, non èstatico ha una firma non supportata. - CS0017: Program has more than one entry point defined. Due classi hanno ciascuna un
Main. Tienine uno, oppure scegline uno con l'impostazioneStartupObjectnel.csproj. - La finestra si chiude subito. Quando un'app console viene avviata con un doppio clic, la finestra si chiude quando
Maintermina. Eseguila da un terminale, oppure aggiungiConsole.ReadKey();alla fine mentre fai i test.
Domande frequenti
Come si scrive Hello World in C#?
Metti Console.WriteLine("Hello, World!"); dentro un metodo static void Main() di una classe, con using System; in cima. In un progetto creato con dotnet new console su .NET 6 o successivi, l'intero file può essere solo quella riga, perché le istruzioni di primo livello generano per te la classe e Main.
Che cos'è il metodo Main in C#?
Main è il punto di ingresso: il metodo che il runtime chiama all'avvio del programma. Deve essere static, può restituire void o int (il codice di uscita) e può accettare un parametro string[] args con gli argomenti della riga di comando. Un programma ne deve avere esattamente uno.
Che differenza c'è tra Console.Write e Console.WriteLine?
Console.WriteLine scrive il testo seguito da un a capo, quindi l'output successivo inizia su una nuova riga. Console.Write scrive solo il testo, quindi l'output successivo continua sulla stessa riga. Console.WriteLine() senza argomenti stampa una riga vuota.
Come leggo l'input dell'utente in C#?
Console.ReadLine() legge una riga di testo e la restituisce come string (senza l'a capo), oppure null quando non c'è altro input. Per ottenere un numero, converti la stringa: int.TryParse(Console.ReadLine(), out int n) restituisce false invece di andare in crash quando il testo non è un numero.
Come eseguo un programma C# dalla riga di comando?
Installa il .NET SDK, poi esegui dotnet new console -o HelloApp per creare un progetto, cd HelloApp e dotnet run per compilarlo ed eseguirlo. dotnet build compila soltanto, e mette l'output in bin/Debug/net8.0/ (o nella versione che hai come target).