It’s also awesome for SREs / SysOps / Whatever We Call Ourselves Today:
Opinionated in a good way, which means almost all C# apps have the same parameterisation with environment variables, command line, and config files. It’s all very systematic, consistent, but flexible and pluggable.
“Node has that too!” you’re about to say. Lol, no. It has bits and pieces the devs have to wire themselves, which means a fleet of vaguely related apps made by independent teams will have wildly different config styles. Good luck consistently making all of them pull API client certs from KMS or Key Vault, or whatever!
OpenTelemetry is now baked in to the core components and rapidly spreading through other libraries.
Excellent “pervasive” system APIs for spans, traces, metrics, and logs means that the sources are omnipresent and very rich, going back decades. Even very old third party libraries are often a breeze to instrument.
Debug snapshots from production crashes on App Service feels like cheating.
Built in container build outputs with no extra tooling.
Sane defaults for its package manager means far fewer nasty security surprises.
Far more first-party “coverage” of essential capabilities in the optional Microsoft packages so you don’t have to resort to NPM where your security-critical code is written by Sergei and support is “LOL Wut!?”
A GC that automatically responds to container limits instead of the host limits.
It uses thread pools for async tasks in most configurations so whole categories of production-time issues that occur with single threaded runtimes just doesn’t happen.
Etc, etc…