<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Csharp on OZ Tech Blog</title><link>https://blog.zaradny.fr/tags/csharp/</link><description>Recent content in Csharp on OZ Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Wed, 26 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.zaradny.fr/tags/csharp/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 10 : lecture Tech Lead d'une plateforme arrivée à maturité</title><link>https://blog.zaradny.fr/post/dotnet-10-csharp/</link><pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.zaradny.fr/post/dotnet-10-csharp/</guid><description>&lt;img src="https://blog.zaradny.fr/" alt="Featured image of post .NET 10 : lecture Tech Lead d'une plateforme arrivée à maturité" /&gt;&lt;h1 id="net-10--une-version-pour-tech-lead-pas-pour-les-slides"&gt;.NET 10 : une version pour Tech Lead, pas pour les slides
&lt;/h1&gt;&lt;p&gt;Il y a des versions qui font rêver les conférenciers.&lt;/p&gt;
&lt;p&gt;Et puis il y a celles qui parlent aux responsables d&amp;rsquo;architecture.&lt;/p&gt;
&lt;p&gt;.NET 10 fait clairement partie de la deuxième catégorie.&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas une version &amp;ldquo;wahou&amp;rdquo;.&lt;br&gt;
C&amp;rsquo;est une version qui dit :&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;La plateforme est mature. Maintenant on optimise.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Et quand on pilote des équipes backend, ça change la lecture.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="native-aot--opportunité-ou-risque-maîtrisé-"&gt;Native AOT : opportunité ou risque maîtrisé ?
&lt;/h2&gt;&lt;p&gt;On va être clair.&lt;/p&gt;
&lt;p&gt;Le Native AOT n&amp;rsquo;est pas une feature gadget.&lt;br&gt;
C&amp;rsquo;est un levier stratégique.&lt;/p&gt;
&lt;h3 id="pourquoi-"&gt;Pourquoi ?
&lt;/h3&gt;&lt;p&gt;Parce qu&amp;rsquo;en environnement containerisé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Démarrage plus rapide&lt;/li&gt;
&lt;li&gt;Image plus légère&lt;/li&gt;
&lt;li&gt;Surface d&amp;rsquo;attaque réduite&lt;/li&gt;
&lt;li&gt;Moins de dépendance runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="publication"&gt;Publication
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet publish -c Release -r linux-x64 -p:PublishAot&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais en tant que Tech Lead, la vraie question est ailleurs.&lt;/p&gt;
&lt;p&gt;👉 Est-ce que mon écosystème est compatible AOT ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reflection dynamique ?&lt;/li&gt;
&lt;li&gt;Sérialisation custom ?&lt;/li&gt;
&lt;li&gt;Packages legacy ?&lt;/li&gt;
&lt;li&gt;Génération runtime ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si ton SI est propre, modulaire, avec peu de magie dynamique…
AOT devient crédible.&lt;/p&gt;
&lt;p&gt;Si ton codebase repose sur 10 ans de conventions implicites…
Ça demande une vraie analyse.&lt;/p&gt;
&lt;p&gt;Donc non, ce n&amp;rsquo;est pas plug &amp;amp; play.&lt;/p&gt;
&lt;p&gt;Mais oui, c&amp;rsquo;est stratégiquement intéressant.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="aspnet-core--optimisation-structurelle"&gt;ASP.NET Core : optimisation structurelle
&lt;/h2&gt;&lt;p&gt;Chaque version améliore les performances.&lt;/p&gt;
&lt;p&gt;Mais .NET 10 franchit un cap subtil :&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Les gains deviennent structurels.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;On parle de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moins d&amp;rsquo;allocations&lt;/li&gt;
&lt;li&gt;Meilleure gestion mémoire&lt;/li&gt;
&lt;li&gt;Pipeline HTTP optimisé&lt;/li&gt;
&lt;li&gt;Throughput plus stable sous charge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Un endpoint simple&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/orders/{id:int}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Processing&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rien de nouveau dans l&amp;rsquo;écriture.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est justement ça le point.&lt;/p&gt;
&lt;p&gt;👉 On gagne sans réécrire.&lt;/p&gt;
&lt;p&gt;Pour un Tech Lead, ça signifie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moins de refactoring forcé&lt;/li&gt;
&lt;li&gt;Pas de rupture technologique&lt;/li&gt;
&lt;li&gt;Migration progressive possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est rassurant.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="observabilité--enfin-native"&gt;Observabilité : enfin native
&lt;/h2&gt;&lt;p&gt;Dans une archi moderne :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracing distribué&lt;/li&gt;
&lt;li&gt;Corrélation des logs&lt;/li&gt;
&lt;li&gt;Métriques runtime&lt;/li&gt;
&lt;li&gt;Dashboards centralisés&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce n&amp;rsquo;est plus optionnel.&lt;/p&gt;
&lt;p&gt;.NET 10 pousse encore plus l&amp;rsquo;intégration OpenTelemetry :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTracing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAspNetCoreInstrumentation&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithMetrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddRuntimeInstrumentation&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En clair :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moins de dépendances custom&lt;/li&gt;
&lt;li&gt;Moins de bricolage&lt;/li&gt;
&lt;li&gt;Meilleur alignement avec les standards cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour un SI distribué, c&amp;rsquo;est un vrai gain de cohérence.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="c--réduction-du-bruit--dette-technique-maîtrisée"&gt;C# : réduction du bruit = dette technique maîtrisée
&lt;/h2&gt;&lt;p&gt;Les évolutions du langage ne sont pas spectaculaires.&lt;/p&gt;
&lt;p&gt;Elles sont ciblées.&lt;/p&gt;
&lt;p&gt;Et ça, c&amp;rsquo;est sain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pattern matching plus expressif&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ResolveAccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IsAdmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;FullAccess&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IsPremium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ExtendedAccess&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;BasicAccess&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Moins de branching.&lt;br&gt;
Moins de complexité cyclomatique.&lt;/p&gt;
&lt;p&gt;À grande échelle, ça réduit la dette technique invisible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Primary constructors&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Moins de boilerplate.&lt;/p&gt;
&lt;p&gt;Ça peut paraitre anodin.&lt;/p&gt;
&lt;p&gt;Mais quand on maintient 200+ services, chaque réduction de bruit améliore la lisibilité globale.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ce-que-ça-veut-dire-pour-un-tech-lead"&gt;Ce que ça veut dire pour un Tech Lead
&lt;/h2&gt;&lt;p&gt;Si je devais résumer .NET 10 en trois points stratégiques :&lt;/p&gt;
&lt;p&gt;1️⃣ &lt;strong&gt;La plateforme est stable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pas de rupture.&lt;br&gt;
Pas de révolution.&lt;br&gt;
Pas de migration traumatisante.&lt;/p&gt;
&lt;p&gt;2️⃣ &lt;strong&gt;La performance devient implicite&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On ne cherche plus à &amp;ldquo;optimiser&amp;rdquo;.&lt;br&gt;
La plateforme optimise pour nous.&lt;/p&gt;
&lt;p&gt;3️⃣ &lt;strong&gt;Le cloud-native n&amp;rsquo;est plus une option&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AOT.&lt;br&gt;
OpenTelemetry.&lt;br&gt;
Containers.&lt;/p&gt;
&lt;p&gt;Tout converge vers ça.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="la-vraie-question"&gt;La vraie question
&lt;/h2&gt;&lt;p&gt;Est-ce qu&amp;rsquo;il faut migrer immédiatement ?&lt;/p&gt;
&lt;p&gt;Pas forcément.&lt;/p&gt;
&lt;p&gt;Mais il faut comprendre la direction.&lt;/p&gt;
&lt;p&gt;.NET 10 n&amp;rsquo;est pas une version spectaculaire.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est une version qui confirme que l&amp;rsquo;écosystème est arrivé à maturité.&lt;/p&gt;
&lt;p&gt;Et honnêtement…&lt;/p&gt;
&lt;p&gt;Pour ceux qui pilotent des équipes backend en production,
c&amp;rsquo;est probablement plus rassurant qu&amp;rsquo;une révolution.&lt;/p&gt;</description></item></channel></rss>