Articoli su c# e il mondo .net
-
Dependency Injection avanzata in .NET: strategie con IServiceProvider e child containers
1. Introduzione La Dependency Injection (DI) è uno dei pilastri architetturali di .NET moderno, ma nella pratica quotidiana molti sviluppatori si fermano ai concetti base: registrare servizi in Program.cs e iniettarli nel costruttore. Tuttavia, in progetti complessi — come microservizi, sistemi multi-tenant o flussi dinamici — è necessario padroneggiare aspetti avanzati: la gestione manuale del…
-
Task vs ValueTask vs IAsyncEnumerable: scegliere il giusto strumento per la concorrenza asincrona
Introduzione: il panorama dell’asincronia in C# Con l’introduzione di async/await, C# ha rivoluzionato il modo in cui gestiamo la concorrenza e l’I/O asincrono.Tuttavia, negli ultimi anni sono apparse nuove astrazioni asincrone — come ValueTask e IAsyncEnumerable — che spingono il modello oltre la semplicità di Task<T>, puntando a ottimizzare la memoria, ridurre l’overhead e migliorare…
-
Source Generators in C#: come generare codice a compile-time per ridurre il boilerplate
Source Generators rappresentano una delle evoluzioni più interessanti del linguaggio C# e dell’ecosistema .NET negli ultimi anni. L’idea di fondo è spostare parte della logica che normalmente scriveremmo a mano o gestiremmo a runtime in fase di compilazione, ottenendo codice statico, sicuro e altamente ottimizzato. Come funzionano Un Source Generator è un analyzer Roslyn che…
-
Migrazioni in EF Core: come progettare e applicare Data Patch in modo sicuro
Quando evolviamo uno schema database con Entity Framework Core, spesso non basta aggiungere una colonna o creare una tabella: serve migrare i dati esistenti (backfill), normalizzare valori storici, riempire tabelle di lookup, creare utenti amministrativi, riallineare flag, ecc. In questo articolo vediamo strategie e pattern per eseguire data patch durante le migrazioni, mantenendo il deploy…
-
Records, init-only e immutabilità controllata: come progettare modelli robusti in C#
L’evoluzione di C# negli ultimi anni ha portato con sé strumenti sempre più potenti per chi vuole progettare modelli robusti, sicuri e facilmente manutenibili. In particolare, con l’introduzione di record types (C# 9), delle proprietà init-only e delle nuove possibilità di definire immutabilità controllata, oggi possiamo strutturare il dominio applicativo con un livello di espressività…
-
Come Creare un Mutex in C# per i Background Job
Introduzione Quando si lavora con background job in C#, uno dei problemi più comuni è la gestione della concorrenza: più processi o thread potrebbero tentare di eseguire la stessa operazione contemporaneamente, causando conflitti o inconsistenze.La soluzione più semplice ed efficace è usare un Mutex (mutual exclusion), che permette di garantire che un solo job alla…
-
Span
, Memory e stackalloc: scrivere C# ad alte prestazioni senza GC overhead In .NET il garbage collector (GC) gestisce la memoria in modo automatico, evitando memory leak e semplificando la vita agli sviluppatori. Tuttavia, in applicazioni ad alte prestazioni (real-time, networking, finanza, AI, elaborazione di dati massivi), il GC può diventare un collo di bottiglia. Per rispondere a questa esigenza, Microsoft ha introdotto strumenti come Span<T>, Memory<T>…
-
C# .NET e .NET Core: guida alle versioni e ai termini
Introduzione Chi si avvicina al mondo C# e .NET spesso rimane confuso da termini come .NET Framework, .NET Core, .NET 5/6/7/8/9 e dalle differenze tra runtime, SDK e CLR.Questa guida nasce per fare chiarezza e fornire una panoramica aggiornata e semplice da consultare. .NET Framework: l’origine Quando usarlo?Solo se si lavora su progetti legacy Windows…
-
Async State Machines in C#: cosa genera il compilatore dietro ogni await
Quando scriviamo codice asincrono in C# utilizzando async e await, il compilatore fa molto più lavoro di quanto possa sembrare. Dietro la semplicità sintattica si nasconde un meccanismo sofisticato: la generazione di state machine asincrone. (C# async state machine) Comprendere come funzionano queste macchine a stati è fondamentale per chiunque voglia padroneggiare le performance, il…
-
C# Pattern Matching avanzato: guard clauses, switch expression e best practice
Introduzione Il pattern matching introdotto con C# 7 e ampliato nelle versioni successive (C# 8, 9, 10 e oltre) è ormai una caratteristica matura del linguaggio. Non si tratta più di un semplice strumento per controllare il tipo di un oggetto, ma di un costrutto espressivo che migliora leggibilità, sicurezza e manutenibilità del codice. In…