Categoria: programmazione .net e c#

  • C# Unsafe e fixed: quando (e come) scrivere codice low-level in sicurezza

    C# Unsafe e fixed: quando (e come) scrivere codice low-level in sicurezza

    Il linguaggio C# è noto per la sua sicurezza e l’astrazione dai dettagli di basso livello, ma esistono scenari dove serve sporcarsi le mani con la memoria.In questi casi entrano in gioco le parole chiave unsafe e fixed, strumenti potenti ma spesso fraintesi, che permettono di lavorare con puntatori e memoria nativa — senza rinunciare…

  • Novità in .NET 10 e C# 14: cosa cambia per lo sviluppatore C#

    Novità in .NET 10 e C# 14: cosa cambia per lo sviluppatore C#

    Introduzione Ogni autunno gli sviluppatori .NET vivono qualcosa di molto simile a un “regalo anticipato”: le nuove versioni del framework e del linguaggio lasciano la fase preview e diventano versioni LTS (long-term support) o STS, pronte per l’adozione nelle aziende. La release di .NET 10 (con C# 14) rappresenta proprio questo passaggio, e merita attenzione…

  • High-performance logging e tracing in .NET con EventSource e DiagnosticSource

    High-performance logging e tracing in .NET con EventSource e DiagnosticSource

    Introduzione Il logging è spesso il primo strumento diagnostico di ogni applicazione .NET, ma non tutti i logger sono uguali.In scenari ad alte prestazioni — microservizi, pipeline di messaggi, telemetria distribuita o analisi in tempo reale — l’uso di ILogger tradizionali può introdurre overhead non trascurabili, soprattutto con log voluminosi. Per questi casi, il runtime…

  • Lock-free programming in C#: usare Interlocked, ConcurrentQueue e strutture ottimizzate

    Lock-free programming in C#: usare Interlocked, ConcurrentQueue e strutture ottimizzate

    Introduzione Il lock-free programming è una branca avanzata della programmazione concorrente che mira a ridurre o eliminare completamente l’uso dei lock (come lock(obj) o Monitor.Enter), evitando così contention e context switch costosi.In contesti altamente paralleli — come pipeline di elaborazione dati, server web ad alte prestazioni o engine di messaggistica — ogni millisecondo risparmiato sul…

  • Reflection, Expression Trees e metaprogrammazione pratica in C#

    Reflection, Expression Trees e metaprogrammazione pratica in C#

    La metaprogrammazione è l’arte di scrivere codice che manipola codice.In C#, questo concetto si concretizza grazie a strumenti potenti come la Reflection API e gli Expression Trees, che permettono di: Nel mondo enterprise (ORM, dependency injection, serializers, mapper, ecc.) questi strumenti sono ovunque — spesso senza che ce ne accorgiamo. In questo articolo vedremo come…

  • Dependency Injection avanzata in .NET: strategie con IServiceProvider e child containers

    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

    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 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

    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#

    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à…