.NET

In Praise of Boring Code
There is a particular kind of pride a developer feels when they compress five lines into one — a dense, clever expression that does somethi…

Pattern Matching in C# and the Code It Quietly Simplifies
Somewhere over the last several C# releases, a set of features arrived that changed the texture of everyday code without most developers no…

The Middleware Pipeline That Shapes Every ASP.NET Core Request
Every request that enters an ASP.NET Core application passes through a pipeline of middleware before a response returns, and yet many devel…

The Span That Cuts Allocations in High-Performance C#
For years, writing genuinely high-performance C# meant fighting the allocator. Every substring, every array slice, every buffer copy create…

Records and Classes in C# and When Each One Fits
When records arrived in C#, they were widely misunderstood as merely a shorter way to write classes — less boilerplate for the same thing.…

The Deferred Execution Trap Behind IQueryable in .NET
Some of the most damaging performance problems in .NET applications hide behind two interfaces that look almost interchangeable: IEnumerabl…

The Async Mistakes That Quietly Break .NET Applications
Few features have done more to improve .NET applications, or caused more subtle bugs, than async and await. The syntax makes asynchronous c…

Minimal APIs vs Controllers in ASP.NET Core
Few decisions divide ASP.NET Core teams as reliably as the choice between minimal APIs and controllers. What began as a lightweight conveni…

Producer/Consumer Pipelines in .NET with System.Threading.Channels
The producer/consumer problem is one of those patterns that every backend eventually needs and almost everyone implements badly the first t…

.NET 11 (STS) vs .NET 10 (LTS) — Which Should a Startup Choose in 2026?
Every November, .NET teams face the same question: stay on the proven LTS release, or jump to the fresh STS one? The advice the first page…

Dependency Injection Lifetimes in ASP.NET Core — Singleton, Scoped, Transient, and the Captive Dependency Trap
ASP.NET Core's built-in dependency injection container is so easy to use that most developers learn just enough of it to register a service…

Span<T> and the Art of Allocation-Free C#
Most performance problems in .NET are invisible until the moment they aren't. The code is correct, the tests pass, the throughput looks fin…

Async/Await in C# — The Mistakes That Cause Deadlocks and How to Avoid Them
async and await are among the most-used keywords in modern C#, and among the most misunderstood. They make asynchronous code read like sync…

NET Aspire 13 Makes Distributed Development Worth Doing Again
There is a kind of developer pain that is so normalised it stopped generating complaints years ago. You join a team building a modern distr…

What .NET 10 Actually Changes for Working Developers
Microsoft released .NET 10 in November 2025 as a long-term support version — meaning it will be supported until November 2028. That LTS tag…