Documentazione C#
Guida di riferimento a C# concisa e ricca di esempi. Leggi il concetto, guarda il codice e poi mettilo in pratica in un percorso Coddy.
Inizia un percorso guidato di C#Primi passi
- Cos'è C#C# è un linguaggio di uso generale a tipizzazione statica, creato da Microsoft, che gira su .NET. A cosa serve, che rapporto ha con .NET, cosa ha aggiunto ogni versione e come è fatto un programma in C#.
- Hello WorldIl tuo primo programma in C# riga per riga: il metodo Main, Console.WriteLine e Write, leggere l'input con Console.ReadLine, i commenti, creare ed eseguire un progetto con la CLI dotnet e le istruzioni di primo livello.
- C# vs JavaC# e Java si assomigliano e risolvono problemi simili. Le differenze reali stanno in proprietà, tipi valore, generics, LINQ contro gli stream, async, eccezioni e negli ecosistemi che li circondano. Un confronto fianco a fianco con il codice.
- C# vs C++C# è un linguaggio gestito con un garbage collector; C++ compila in codice nativo e ti dà il controllo manuale della memoria. Come questa differenza si riflette su sicurezza, prestazioni, motori di gioco, modello di build e difficoltà di apprendimento.
- Namespace e usingCome i namespace di C# organizzano i tipi e come la direttiva using li importa: alias, using static, nomi completi, come risolvere i riferimenti ambigui, global using e namespace con ambito di file.
Le basi
- VariabiliCome dichiarare e assegnare le variabili in C#, quando var è una buona idea e quando no, come funziona l'ambito, la differenza tra const, readonly e static readonly, le convenzioni sui nomi e l'errore della variabile non assegnata.
- Tipi di datiTutti i tipi predefiniti di C# con dimensione, intervallo e suffisso dei letterali, la differenza tra tipi valore e tipi riferimento, perché decimal è il tipo giusto per il denaro, l'overflow degli interi con checked e i valori predefiniti.
- Da string a intCome convertire una stringa in int in C# con int.Parse, int.TryParse e Convert.ToInt32, come funzionano i cast impliciti ed espliciti, perché il cast di un double tronca, gli operatori as e is, e perché "1.5" può diventare 15.
- OperatoriGli operatori di C# con il loro comportamento esatto: divisione intera, l'operatore modulo con i numeri negativi, incremento e assegnazione composta, confronto, logica con cortocircuito, operatori bitwise, gli operatori per null e una tabella delle precedenze.
- StringheCome funzionano le stringhe in C#: immutabilità, Length e indicizzazione, confronto con ==, Equals e string.Compare, caratteri di escape, stringhe verbatim con @ e testo multiriga, raw string literal, controlli su null e stringa vuota, e cicli sui caratteri.
- SubstringCome funziona String.Substring in C#: gli argomenti indice iniziale e lunghezza, l'ArgumentOutOfRangeException e come evitarla, estrarre testo attorno ai risultati di IndexOf, prendere i primi o gli ultimi n caratteri, e l'operatore di intervallo di C# 8.
- Interpolazione di stringheCome funziona l'interpolazione di stringhe $"..." in C#: espressioni tra graffe, specificatori di formato come F2, N0, C, D5 e X, allineamento per le tabelle, escape delle graffe, string.Format e formattazione composita, stringhe interpolate verbatim e raw, e formattazione per una cultura specifica.
- Metodi delle stringheI metodi di String che usi ogni giorno in C#: Split con più separatori e opzioni, Replace, Contains e la ricerca senza distinzione tra maiuscole e minuscole, IndexOf e LastIndexOf, StartsWith ed EndsWith, Trim, ToUpper e ToLower, PadLeft, Join, Concat e come invertire una stringa.
- StringBuilderPerché concatenare stringhe ripetutamente in un ciclo è lento in C#, e come lo risolve StringBuilder: Append, AppendLine, AppendFormat, Insert, Remove, Replace, capacità, e quando la semplice concatenazione o string.Join sono la scelta migliore.
- Numeri casualiCome generare numeri casuali in C# con la classe Random: Next e il suo limite superiore escluso, double casuali in un intervallo, seed per risultati riproducibili, scegliere un elemento a caso, mescolare una lista, la trappola di new Random in un ciclo e i numeri crittograficamente sicuri.
- DateTimeLavorare con date e ore in C#: creare valori DateTime, Now vs UtcNow vs Today, aggiungere giorni e mesi, sottrarre per ottenere un TimeSpan, TotalHours vs Hours, confrontare date, DayOfWeek, analizzare stringhe con ParseExact e TryParse, DateTimeOffset e DateOnly.
- Formato DateTimeCome formattare un DateTime come stringa in C#: le stringhe di formato standard (d, D, o, s, u, t), i pattern personalizzati come yyyy-MM-dd HH:mm:ss, una tabella completa degli specificatori, come la cultura cambia l'output, il round-trip ISO 8601 con "o" e gli errori tra mm e MM e tra hh e HH.
Controllo del flusso
- if elseCome funzionano if, else if ed else in C#: perché le condizioni devono essere bool, combinare i test con &&, || e !, quando contano le graffe, le guard clause al posto dell'annidamento profondo, e i bug di = al posto di == e del punto e virgola di troppo.
- Istruzione switchCome funziona l'istruzione switch in C#: switch su valori int, string, char ed enum, perché ogni case ha bisogno di break (errore CS0163), etichette case impilate per più valori, goto case, default, maiuscole e minuscole nelle stringhe, ed etichette case con pattern e when.
- Switch expressionLa switch expression di C# 8 trasforma un valore in un risultato con rami basati su pattern invece di case e break. Sintassi, il discard _, pattern di proprietà, tuple e relazionali, and/or/not, guardie when, avvisi di esaustività e SwitchExpressionException, con equivalenti eseguibili in C# 7.
- Operatore ternarioL'operatore condizionale di C# condition ? a : b sceglie uno tra due valori. Come viene valutato, perché entrambi i rami devono avere un tipo comune (CS0173) e il cast che lo risolve, ternari annidati, parentesi nell'interpolazione di stringhe, e quando ?? e ?. lo dicono meglio.
- Ciclo forCome funziona il ciclo for in C#: inizializzatore, condizione e iteratore, contare all'indietro e a passi, più variabili di ciclo, scorrere gli array per indice, cicli annidati, for(;;) e i bug off-by-one e da rimozione durante l'iterazione.
- Ciclo foreachCome funziona foreach in C#: scorrere array, liste, stringhe e dizionari (KeyValuePair e decostruzione), ottenere l'indice, perché la variabile del ciclo è di sola lettura, l'InvalidOperationException "Collection was modified" e come risolverla, e cosa serve a un tipo per essere usato in foreach.
- Ciclo whileCome funzionano i cicli while e do while in C#: la condizione controllata prima o dopo il corpo, leggere l'input fino a un valore sentinella o fino alla fine, while (true) con break e gli errori da ciclo infinito in cui cadono in molti.
- break e continueCome funzionano break, continue e goto in C#: terminare un ciclo in anticipo, saltare un'iterazione, break dentro uno switch, tre modi per uscire da cicli annidati (un flag, goto o un metodo con return) e il bug del ciclo infinito con continue nel while.
Metodi e delegati
- MetodiCome dichiarare e chiamare metodi in C#: tipi di ritorno e void, parametri, metodi con corpo di espressione, restituire più valori con una tupla, overloading, array params, metodi statici e di istanza, il metodo Main, ricorsione e funzioni locali.
- Parametri opzionaliCome funzionano i parametri opzionali e gli argomenti con nome in C#: valori predefiniti e la regola della costante in fase di compilazione, ordine dei parametri, saltare argomenti usando il nome, parametri opzionali contro overload, attributi caller info e la trappola del versioning dei default copiati nei chiamanti.
- ref e outCome funzionano i parametri ref, out e in in C#: passare una variabile invece di una copia, out per risultati aggiuntivi e lo schema TryParse, out var, parametri in di sola lettura, le regole di assegnazione certa e cosa cambia quando l'argomento è un tipo riferimento.
- Espressioni lambdaCome funzionano le espressioni lambda in C#: la sintassi => in tutte le sue forme, memorizzare le lambda in Func e Action, passarle ai metodi e a LINQ, le lambda con blocco di istruzioni, le closure sulle variabili catturate e il bug di cattura nel ciclo for che foreach non ha.
- DelegateCos'è un delegate in C# e come si usa: dichiarare un tipo delegate, crearlo da un metodo, da una lambda o da un metodo anonimo, invocarlo, i delegate come callback, i delegate multicast con += e -=, il controllo su null con ?.Invoke e il rapporto tra delegate, Func, Action ed eventi.
- Func e ActionCome funzionano Func e Action in C#: Func<T, TResult> per le funzioni che restituiscono un valore, Action<T> per quelle che non lo fanno, Predicate e Comparison, passare e restituire funzioni, un dizionario di comandi, lambda async e quando dichiarare invece un delegate tuo.
- EventiCome funzionano gli eventi in C#: dichiarare un evento con EventHandler e EventHandler<T>, classi EventArgs personalizzate, sottoscrivere e annullare la sottoscrizione con += e -=, generare un evento in sicurezza con ?.Invoke, perché un evento è meglio di un campo delegate pubblico e il memory leak causato da una sottoscrizione dimenticata.
- Metodi di estensioneCome funzionano i metodi di estensione in C#: un metodo statico in una classe statica con this sul primo parametro, chiamato come un metodo di istanza, per estendere string, enum e IEnumerable<T>, come LINQ è costruito su di essi, perché vincono i metodi di istanza, i receiver null e la direttiva using che serve.
Collezioni e LINQ
- ArrayUn array in C# è un blocco di dimensione fissa di elementi dello stesso tipo. Impara a dichiarare e inizializzare array, leggere Length, ordinare e cercare con la classe Array, copiarli in modo sicuro e lavorare con array 2D e jagged.
- ListList<T> è l'array espandibile di C#. Impara a creare una lista, aggiungere e inserire elementi, rimuoverli per valore, indice o condizione, cercare con Contains e Find, ordinare per proprietà ed evitare l'errore che si ottiene modificando una lista dentro un foreach.
- DictionaryDictionary<TKey, TValue> associa chiavi a valori con una ricerca veloce. Impara ad aggiungere e aggiornare voci, leggere in sicurezza con TryGetValue, scorrere le voci KeyValuePair, contare le occorrenze, ignorare maiuscole e minuscole nelle chiavi e tenere le chiavi ordinate con SortedDictionary.
- HashSetHashSet<T> contiene elementi unici e risponde a Contains in tempo costante. Scopri come Add segnala i duplicati, come rimuovere i duplicati da una lista, come fare unione, intersezione e differenza di insiemi, e come far confrontare a un set i tuoi oggetti per valore.
- QueueQueue<T> è una collezione first in, first out: gli elementi escono nell'ordine in cui sono arrivati. Impara Enqueue, Dequeue e Peek, l'eccezione della coda vuota e TryDequeue, la ricerca in ampiezza con una coda e quando passare a ConcurrentQueue o PriorityQueue.
- StackStack<T> è una collezione last in, first out: l'elemento aggiunto per ultimo esce per primo. Impara Push, Pop e Peek, l'eccezione della pila vuota e TryPop, perché una pila si enumera al contrario, e due usi classici: una cronologia di annullamento e il controllo delle parentesi bilanciate.
- TupleUna tupla di C# raggruppa pochi valori in uno solo senza dichiarare un tipo. Impara la sintassi delle value tuple, gli elementi con nome, come restituire più valori da un metodo, la decostruzione con var (a, b), le tuple come chiavi di un dizionario, e in cosa ValueTuple differisce dal vecchio System.Tuple.
- LINQLINQ aggiunge operatori di query a ogni collezione in C#. Impara la sintassi a metodi e la sintassi di query, filtrare con Where, proiettare con Select, ordinare con OrderBy e ThenBy, raggruppare con GroupBy, la trappola di First e FirstOrDefault, gli aggregati e come l'esecuzione differita cambia il momento in cui la query viene eseguita.
- IEnumerable e yieldIEnumerable<T> è l'interfaccia dietro foreach e LINQ, e yield return è il modo più semplice per implementarla. Scopri che rapporto c'è tra IEnumerable, ICollection e List, come viene eseguito passo dopo passo un metodo iteratore, yield break, le sequenze infinite e le trappole della valutazione lazy.
Classi e tipi
- Classi e oggettiCome dichiarare una classe in C#, darle campi e metodi, creare oggetti con new e cosa significa che una classe è un tipo riferimento: oggetti condivisi, null e NullReferenceException, ToString e inizializzatori di oggetto.
- CostruttoriCome funzionano i costruttori in C#: il costruttore predefinito implicito e quando sparisce, costruttori con parametri e in overload, concatenamento con this(...) e base(...), l'ordine di esecuzione, costruttori statici e privati e i primary constructor di C# 12.
- ProprietàCome funzionano le proprietà in C#: accessor get e set su un campo di appoggio, auto-property, private set e proprietà di sola lettura, proprietà calcolate, validazione nei setter e le parole chiave init e required di C# 9 e 11.
- Parola chiave staticCosa significa static in C#: membri che appartengono al tipo invece che a un oggetto, stato condiviso tra le istanze, metodi statici e classi statiche, costruttori statici, const e static readonly, using static e l'errore CS0120.
- Modificatori di accessoI sei modificatori di accesso di C# (public, private, protected, internal, protected internal, private protected), cosa permette ciascuno, i valori predefiniti quando non ne scrivi nessuno e gli errori di compilazione che producono.
- EreditarietàCome funziona l'ereditarietà tra classi in C#: derivare con i due punti, cosa viene ereditato e cosa no, chiamare la classe base con base, virtual e override, nascondere con new (e l'output che sorprende tutti), sealed, il polimorfismo e i cast verso l'alto e verso il basso nella gerarchia.
- Classi astratteCos'è una classe astratta in C#: una classe base che non si può istanziare e che può dichiarare membri astratti che le classi derivate devono implementare. Vedrai metodi e proprietà astratti, costruttori, il pattern template method e quando scegliere invece un'interfaccia.
- InterfacceCome funzionano le interfacce in C#: dichiararne una, implementarla in classi e struct, usare l'interfaccia come tipo, implementarne più di una insieme, l'implementazione esplicita, le interfacce del framework che implementerai più spesso (IComparable<T>, IEnumerable<T>, IDisposable) e i metodi predefiniti delle interfacce di C# 8.
- StructCome funzionano le struct in C#: semantica di valore e copia nell'assegnazione, l'errore di modifica con List<T>, le regole dei costruttori, uguaglianza, boxing, readonly struct e record struct, e un confronto struct vs class con indicazioni su quando una struct è la scelta giusta.
- EnumCome funzionano gli enum in C#: dichiarare costanti con nome, valori interi sottostanti e cast, convertire un enum in stringa e una stringa in enum con Parse e TryParse, elencare tutti i valori, [Flags] con operatori bit a bit e HasFlag, lo switch su un enum e la gestione dei valori non definiti.
- RecordCosa sono i record in C# (da C# 9): sintassi posizionale, i membri generati dal compilatore, uguaglianza basata sui valori, copie non distruttive con with, il ToString integrato, record struct di C# 10, ereditarietà tra record e la classe equivalente scritta a mano.
- GenericsCome funzionano i generics in C#: scrivere classi e metodi generici con parametri di tipo, inferenza del tipo, vincoli con where (class, struct, new(), classi base, interfacce), default(T), membri statici per tipo e covarianza con IEnumerable<out T>.
- Tipi nullableTutto su null in C#: tipi valore nullable (int?, Nullable<T>) con HasValue, Value e GetValueOrDefault, gli operatori di null coalescing ?? e ??=, l'operatore condizionale null ?., i controlli su null e i tipi riferimento nullable (string?) di C# 8.
- Pattern matchingCome funziona il pattern matching in C#: l'operatore is con pattern di tipo e di costante, istruzioni switch con pattern nei case e when, espressioni switch, pattern di proprietà, di tupla e posizionali, pattern relazionali e logici (and, or, not), list pattern, e quale versione di C# ha introdotto ciascuno.
Eccezioni
- Try catchtry, catch e finally sono il modo in cui C# gestisce le eccezioni. Scopri come un'eccezione risale lo stack delle chiamate, come catturare tipi di eccezione specifici nell'ordine giusto, filtrare con when, fare pulizia in finally, rilanciare con throw; senza perdere lo stack trace, e quali eccezioni non catturare.
- Lanciare eccezioniCome e quando lanciare eccezioni in C#. Impara l'istruzione throw, quale tipo di eccezione predefinito si adatta a quale errore, le throw expression con ?? e ?:, i metodi di supporto ThrowIfNull, e come scrivere una classe di eccezione personalizzata con dati propri e un'eccezione interna.
- Istruzione usingL'istruzione using garantisce che Dispose venga chiamato su file, stream, connessioni e altri oggetti IDisposable, anche quando viene lanciata un'eccezione. Scopri in cosa viene compilata, l'ordine in cui gli oggetti vengono eliminati, la dichiarazione using di C# 8 e come implementare IDisposable nella tua classe.
Asincronia e thread
- Async Awaitasync e await permettono al codice C# di attendere operazioni lente senza bloccare un thread. Scopri come viene eseguito un metodo async, Task e Task<T>, come eseguire insieme operazioni indipendenti con Task.WhenAll, le eccezioni nel codice async e perché async void e .Result causano bug e deadlock.
- TaskTask è l'unità di lavoro asincrono e parallelo in .NET. Impara Task.Run per il lavoro legato alla CPU, la lettura dei risultati, la combinazione di task con WhenAll e WhenAny, le continuazioni, la cancellazione con CancellationToken, la differenza tra Task e Thread, e quando Parallel.For è più adatto.
- LockL'istruzione lock permette a un solo thread alla volta di eseguire un blocco di codice. Guarda una race condition corrompere un contatore, correggila con lock, scopri su quale oggetto fare lock, usa Interlocked per i contatori semplici, evita i deadlock dovuti all'ordine dei lock e usa SemaphoreSlim quando il codice all'interno fa await.
- TimerC# ha diverse classi timer e si comportano in modo diverso. Scopri quando usare System.Threading.Timer, System.Timers.Timer, PeriodicTimer o un timer dell'interfaccia grafica, come avviarli e fermarli, perché le callback girano sul thread pool e possono sovrapporsi, perché un timer deve restare referenziato, e come misurare il tempo trascorso con Stopwatch.
File, JSON e altro
- Leggere e scrivere fileCome scrivere su un file e leggere un file in C#: File.WriteAllText, ReadAllText, AppendAllText, WriteAllLines e ReadAllLines per file interi, StreamWriter e StreamReader per quelli grandi, percorsi con Path.Combine, cartelle, codifiche e le eccezioni che il codice sui file deve gestire.
- JSONCome lavorare con JSON in C# usando System.Text.Json: JsonSerializer.Serialize e Deserialize, output camelCase e indentato, attributi come JsonPropertyName e JsonIgnore, enum come stringhe, leggere JSON senza classi con JsonDocument e JsonNode, gli errori e il confronto con Newtonsoft.Json.
- RegexCome usare le espressioni regolari in C# con System.Text.RegularExpressions: IsMatch, Match e Matches, gruppi numerati e con nome, Replace con sostituzioni e con una lambda, Split, RegexOptions, stringhe verbatim per i pattern, validazione dell'input, timeout e l'attributo GeneratedRegex di .NET 7.
- Reflection e attributiCome funziona la reflection in C#: oggetti Type da typeof e GetType, leggere e impostare proprietà, chiamare metodi per nome, creare istanze, e gli attributi: quelli integrati come Obsolete, come dichiararne di tuoi e leggerli in esecuzione. Più quanto costa la reflection.