C# Cheat Sheet
Ultimo aggiornamento
Hello World e struttura del programma
Le istruzioni di primo livello (da .NET 6) ti evitano la classe di boilerplate.
| Elemento | Codice |
|---|---|
| Programma con istruzioni di primo livello | Console.WriteLine("Hello, World!"); |
| Importare un namespace | using System; |
| Punto di ingresso classico | static void Main(string[] args) { ... } |
| Stampare una riga | Console.WriteLine("text"); |
| Leggere una riga | string s = Console.ReadLine(); |
| Interpolazione di stringhe | Console.WriteLine($"Hi {name}"); |
| Commenti | // line e /* block */ |
Tipi di dati
| Tipo | Descrizione |
|---|---|
int | Intero con segno a 32 bit |
long | Intero con segno a 64 bit |
double / float | Numeri in virgola mobile |
decimal | Decimale ad alta precisione (importi) |
bool | true o false |
char | Singolo carattere Unicode |
string | Testo immutabile |
var | Il compilatore deduce il tipo |
int? | Tipo valore nullable |
Variabili
| Operazione | Sintassi |
|---|---|
| Dichiarare e inizializzare | int x = 5; |
| Inferenza del tipo | var name = "Ada"; |
| Costante | const double Pi = 3.14159; |
| Campo di sola lettura | readonly int id; |
| Riferimento nullable | string? maybe = null; |
| Null-coalescing | var y = maybe ?? "default"; |
| Null-conditional | int? len = text?.Length; |
Controllo del flusso
| Istruzione | Sintassi |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Istruzione switch | switch (n) { case 1: ...; break; default: ...; } |
| Espressione switch | var s = n switch { 1 => "one", _ => "other" }; |
| Ciclo while | while (i < n) { ... } |
| Ciclo do-while | do { ... } while (i < n); |
| Ciclo for | for (int i = 0; i < n; i++) { ... } |
| Ciclo foreach | foreach (var item in list) { ... } |
| Break / continue | break; esce da un ciclo, continue; passa all'iterazione successiva |
Metodi
| Operazione | Sintassi |
|---|---|
| Definire un metodo | int Add(int a, int b) { return a + b; } |
| Corpo a espressione | int Add(int a, int b) => a + b; |
| Nessun valore di ritorno | void Greet() { ... } |
| Parametro opzionale | int Pow(int b, int e = 2) { ... } |
| Argomenti con nome | Pow(b: 2, e: 3); |
| Parametro out | bool TryParse(string s, out int n) { ... } |
| Metodo statico | static int Square(int x) => x * x; |
| Espressione lambda | Func<int, int> f = x => x * 2; |
Classi e OOP
| Operazione | Sintassi |
|---|---|
| Definire una classe | class Dog { ... } |
| Proprietà automatica | public string Name { get; set; } |
| Proprietà di sola lettura | public int Id { get; } |
| Constructor | public Dog(string name) { Name = name; } |
| Creare un oggetto | var d = new Dog("Rex"); |
| Ereditarietà | class Puppy : Dog { ... } |
| Interfaccia | interface IRunnable { void Run(); } |
| Sovrascrivere un metodo | public override void Speak() { ... } |
| Record (immutabile) | record Point(int X, int Y); |
Collezioni
Collezioni generiche di System.Collections.Generic.
| Tipo | Uso ed esempio |
|---|---|
List<T> | Array dinamico: list.Add(1); list.Count; |
Dictionary<K, V> | Chiave-valore: dict["a"] = 1; dict.ContainsKey("a"); |
HashSet<T> | Valori unici: set.Add(5); set.Contains(5); |
Queue<T> | FIFO: q.Enqueue(x); q.Dequeue(); |
Stack<T> | LIFO: s.Push(x); s.Pop(); |
| Array | int[] nums = { 1, 2, 3 }; |
| Inizializzatore di collezione | var l = new List<int> { 1, 2, 3 }; |
| Iterare un dizionario | foreach (var kv in dict) { kv.Key; kv.Value; } |
LINQ
Interroga le collezioni in modo fluente; da System.Linq.
| Operazione | Sintassi |
|---|---|
| Filtrare | nums.Where(n => n > 0) |
| Proiettare / mappare | nums.Select(n => n * 2) |
| Ordinare | nums.OrderBy(n => n) / OrderByDescending(...) |
| Prima corrispondenza | nums.First(n => n > 5) / FirstOrDefault(...) |
| Any / all | nums.Any(n => n < 0) / nums.All(n => n > 0) |
| Contare le corrispondenze | nums.Count(n => n > 0) |
| Aggregare | nums.Sum(), nums.Max(), nums.Average() |
| Raggruppare | items.GroupBy(i => i.Category) |
| Materializzare | .ToList() / .ToArray() |
Schemi comuni (proprietà, async)
| Schema | Sintassi |
|---|---|
| Metodo async | async Task<int> GetAsync() { ... } |
| Attendere un task | var result = await GetAsync(); |
| Try / catch | try { ... } catch (Exception e) { ... } |
| Finally | finally { ... } viene sempre eseguito |
| Using (dispose) | using var file = File.OpenRead(path); |
| Formattazione delle stringhe | $"Total: {amount:C}" |
| Classe generica | class Box<T> { public T Value; } |
| Pattern matching | if (obj is Dog d) { d.Bark(); } |
La sintassi, le collezioni e le query LINQ di C# che usi di più, in una sola pagina. Questa cheat sheet di C# è un riferimento rapido per scrivere in C#: tipi di dati, controllo del flusso, classi, le collezioni List/Dictionary, LINQ e gli schemi con proprietà e async che caratterizzano il codice .NET idiomatico.
Tutto quello che trovi qui è C# standard su .NET e gira con la CLI dotnet. Copia quello che ti serve oppure prova qualsiasi frammento dal vivo nel playground C#, senza installare nessun SDK.
Domande frequenti sulla cheat sheet di C#
Questa cheat sheet di C# è gratuita?
Qual è la differenza tra tipi valore e tipi riferimento in C#?
int, double, bool, struct, enum) contengono direttamente i dati e vengono copiati quando li assegni o li passi a un metodo: modificare la copia non tocca l'originale. I tipi riferimento (class, string, array, List<T>) contengono un riferimento a dati sull'heap, quindi due variabili possono puntare allo stesso oggetto e una modifica fatta tramite una è visibile anche dall'altra. string è un tipo riferimento ma si comporta come immutabile.Cos'è LINQ e quando conviene usarlo?
Where, Select e OrderBy che ti permettono di filtrare, trasformare e aggregare collezioni con chiamate leggibili e concatenabili invece di cicli scritti a mano. Usalo ogni volta che altrimenti scriveresti un ciclo per costruire una lista filtrata o proiettata: è conciso e viene valutato in modo lazy finché non chiami ToList() o non iteri.