<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-27752126</id><updated>2026-04-13T08:01:00.117+02:00</updated><category term="enlaces"/><category term="trucos"/><category term="desarrollo"/><category term="aspnetmvc"/><category term="novedades"/><category term="asp.net"/><category term="c#"/><category term="aspnetcore"/><category term=".net"/><category term="programación"/><category term="aspnetcoremvc"/><category term="blogging"/><category term="autobombo"/><category term="web"/><category term="blazor"/><category term="curiosidades"/><category term="buenas prácticas"/><category term="noticias"/><category term="servicios on-line"/><category term="aniversario"/><category term="herramientas"/><category term="variablenotfound"/><category term="javascript"/><category term="blazorwasm"/><category term="blazorserver"/><category term="vs2008"/><category term="netcore"/><category term="vb.net"/><category term="eventos"/><category term="humor"/><category term="vacaciones"/><category term="historias"/><category term="mvp"/><category term="patrones"/><category term="variablenotfound.com"/><category term="ajax"/><category term="css"/><category term="jquery"/><category term="sponsored"/><category term="signalr"/><category term="spam"/><category term="xhtml"/><category term="antispam"/><category term="consultas"/><category term="mono"/><category term="componentes"/><category term="inocentadas"/><category term="personal"/><category term="sorteo"/><category term="estándares"/><category term="microsoft"/><category term="frikadas"/><category term="recomendaciones"/><category term="tecnología"/><category term="técnicas de spam"/><category term="viajes"/><category term="10años"/><category term="auges"/><category term="c#6"/><category term="curso"/><category term="diseño"/><category term="google"/><category term="navidad"/><category term="scripting"/><category term="software libre"/><category term="webapi"/><category term="depuración"/><category term="efcore"/><category term="frases célebres"/><category term="productividad"/><category term="trabajo"/><category term="visualstudio"/><category term=".net9"/><category term="bases de datos"/><category term="c#bizarro"/><category term="calidad"/><category term="charlas"/><category term="libros"/><category term="razor"/><category term="software"/><category term="validadores"/><category term="c#8"/><category term="cartujadotnet"/><category term="entity framework"/><category term="katana"/><category term="linq"/><category term="owin"/><category term="proyectos"/><category term="seguridad"/><category term="tutorial"/><category term="tutorial-owin-katana"/><category term="c#7"/><category term="chuletas"/><category term="conceptos"/><category term="interfaces"/><category term="nivel básico"/><category term="rendimiento"/><category term="summit"/><category term="antipatrones"/><category term="azure"/><category term="c#10"/><category term="colaboraciones"/><category term="comentarios"/><category term="desastres"/><category term="html"/><category term="optimización"/><category term="blogger"/><category term="buscadores"/><category term="c#11"/><category term="frameworks"/><category term="instalación"/><category term="json"/><category term="leyes"/><category term="linux"/><category term="middlewares"/><category term="opinión"/><category term="protocolos"/><category term="resumen"/><category term="routing"/><category term="utilidades"/><category term="vs2010"/><category term=".net10"/><category term=".net8"/><category term="alegrías"/><category term="apis"/><category term="aspnet5"/><category term="ayuda"/><category term="blazorinterop"/><category term="c#12"/><category term="c#9"/><category term="epónimos"/><category term="error"/><category term="fiddler"/><category term="grpc"/><category term="historia"/><category term="http"/><category term="ie"/><category term="lambdas"/><category term="localizacion"/><category term="niftydotnet"/><category term=".netcore"/><category term="ado.net"/><category term="c#13"/><category term="cms"/><category term="dsl"/><category term="empresa"/><category term="errores"/><category term="generadores"/><category term="interacción"/><category term="java"/><category term="jorgeturrado"/><category term="jqGrid"/><category term="knockout"/><category term="metaprogramación"/><category term="motores de física"/><category term="nostalgia"/><category term="nuget"/><category term="oscarsotorrio"/><category term="paranoias"/><category term="problema"/><category term="reflexiones"/><category term="signalr21"/><category term="static files"/><category term="syncfusion"/><category term="tags"/><category term="unity"/><category term="vs2019"/><category term="vs2022"/><category term="webmatrix"/><category term="webpages"/><category term="Spectrum"/><category term="actualidad"/><category term="arquitectura"/><category term="asincronía"/><category term="c#14"/><category term="campusmvp"/><category term="creatividad"/><category term="delegados"/><category term="emoticonos"/><category term="equipos"/><category term="extensiones"/><category term="flash"/><category term="innovadores"/><category term="interfaces fluidos"/><category term="jwt"/><category term="navegadores"/><category term="netframework"/><category term="nivel alto"/><category term="office"/><category term="openapi"/><category term="orcas"/><category term="orm"/><category term="phishing"/><category term="portales"/><category term="radarc"/><category term="redes"/><category term="redes sociales"/><category term="redondear esquinas"/><category term="streaming"/><category term="summit2012"/><category term="swagger"/><category term="t4"/><category term="troyanos"/><category term="vs"/><category term="vs2012"/><category term="vsanywhere"/><category term="webforms"/><category term="webgrid"/><category term="windows"/><category term="árboles de expresión"/><category term=".net6"/><category term=".net7"/><category term="10x"/><category term="1337"/><category term="2.0"/><category term="2009"/><category term="SEO"/><category term="analytics"/><category term="análisis"/><category term="aspnet"/><category term="aspnetcore mvc"/><category term="aspnetvnext"/><category term="async"/><category term="autenticación"/><category term="autofac"/><category term="blazorrserver"/><category term="bootcamp"/><category term="bootstrap"/><category term="bytecode"/><category term="c++"/><category term="caching"/><category term="cadenas de conexión"/><category term="calendar"/><category term="chacha"/><category term="chascarrillos"/><category term="chrome"/><category term="closedxml"/><category term="communityday"/><category term="compilador"/><category term="concienciación"/><category term="connection strings"/><category term="conquista del mundo"/><category term="cultura"/><category term="dans"/><category term="data"/><category term="desarrolladores"/><category term="dynamicsections"/><category term="emuladores"/><category term="ensamblador"/><category term="entrevistas"/><category term="envidia"/><category term="escaneo de puertos"/><category term="eswebcamp"/><category term="fluent interfaces"/><category term="genios"/><category term="glimpse"/><category term="gmail"/><category term="haloscan"/><category term="homenaje"/><category term="leet speak"/><category term="liame"/><category term="mobile"/><category term="msdewey"/><category term="msil"/><category term="mvc"/><category term="métodos anónimos"/><category term="net"/><category term="net8"/><category term="nivel medio"/><category term="nupack"/><category term="ofuscación de emails"/><category term="planetas"/><category term="powershell"/><category term="problemas"/><category term="productos"/><category term="quaere"/><category term="razorpages"/><category term="records"/><category term="rest"/><category term="riqueza"/><category term="scrum"/><category term="silverlight"/><category term="technorati"/><category term="ttt"/><category term="typescript"/><category term="virus"/><category term="vs2005"/><category term="vs2015"/><category term="vs2017"/><category term="vs2026"/><category term="vscode"/><category term="xVal"/><title type='text'>Variable not found</title><subtitle type='html'>Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web&#xa;ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default?start-index=26&amp;max-results=25'/><author><name>josé M. Aguilar</name><uri>http://www.blogger.com/profile/11683750380776435448</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1632</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27752126.post-3837292177887920600</id><published>2026-04-13T08:01:00.001+02:00</published><updated>2026-04-13T08:01:00.113+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 643</title><content type='html'>

&lt;img alt=&quot;Dos desarrolladores cargando con el peso de la deuda técnica generada por la IA&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBAupKEqFdp5SuckJABdQd8rgHx2vNY1mcdiJYXdrV4lHeWWlcaewgAhUNWSXkgqwCg1uGJnGE6GpHZFw9KEg-Lz_DkfIs9MYvsWpPr2-iecyqXtybzpV5vnI0eToeBcfyyLJnPlYzmouqKQYBHc-o0GgbCzKe1BGUV7AMxRYOYZ0Zvo5-I1aC5g/s800/ia-tech-debt.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Tras una semana de parón debido a las fiestas, volvemos con una nueva entrega de enlaces interesantes. En esta ocasión, al tratarse de dos semanas de cosecha, tenemos una recopilación bastante cargadita de contenidos a los que vale la pena echar un vistazo.&lt;/p&gt;
&lt;p&gt;Pero como siempre, destacaremos unos cuantos.&lt;/p&gt;
&lt;p&gt;José Manuel Alarcón nos habla de que el uso de&lt;a href=&quot;https://www.campusmvp.es/recursos/post/la-ia-genera-deuda-tecnica-causas-riesgos-y-como-evitarlos-guia-completa-para-tecnicos.aspx&quot; target=&quot;_blank&quot;&gt; la IA sin un control adecuado podría introducir deuda técnica en nuestros proyectos&lt;/a&gt;, y nos ofrece una guía para evitarla.&lt;/p&gt;
&lt;p&gt;Con tanta novedad en el mundo de las herramientas IA para desarrolladores, a veces no es fácil distinguir conceptos que a priori parecen similares, pero en realidad son muy diferentes. Para ayudarnos un poco con esto, Juan Luis Guerrero nos explica las &lt;a href=&quot;https://elguerre.com/2026/03/30/ai-agents-vs-skills-commands-in-claude-code-codex-copilot-cli-gemini-cli-stop-mixing-them-up/&quot; target=&quot;_blank&quot;&gt;diferencias entre agentes, skills y comandos&lt;/a&gt; en el contexto de herramientas como Claude Code, Codex, Copilot CLI y Gemini CLI.&lt;/p&gt;
&lt;p&gt;Fernando Escolar nos recuerda &lt;a href=&quot;https://www.developerro.com/2026/04/01/tyding-up-your-code/&quot; target=&quot;_blank&quot;&gt;la importancia de mejorar continuamente nuestro código&lt;/a&gt; con pequeños cambios, que, aunque no sean espectaculares, pueden marcar una gran diferencia en la calidad y mantenibilidad de nuestro software.&lt;/p&gt;
&lt;p&gt;Gerson Azabache nos habla de &lt;a href=&quot;https://bravedeveloper.com/2026/03/29/tu-app-necesita-workers-silenciosos-el-patron-que-usa-amazon-para-no-hacerte-esperar/&quot; target=&quot;_blank&quot;&gt;&quot;workers&quot; o tareas en segundo plano&lt;/a&gt; para lograr que nuestras aplicaciones respondan de forma rápida y eficiente, consiguiendo una experiencia de usuario más fluida, y luego nos enseña &lt;a href=&quot;https://bravedeveloper.com/2026/04/05/background-jobs-en-net-con-ihostedservice-procesa-tareas-en-segundo-plano/&quot; target=&quot;_blank&quot;&gt;cómo implementarlos en .NET&lt;/a&gt; con IHostedService.&lt;/p&gt;
&lt;p&gt;Y para terminar, todo un clásico: ¿quieres mostrar una dirección de correo electrónico en tu sitio web sin que los &lt;em&gt;spammers&lt;/em&gt; se ceben con ella? Spencer Mortensen nos cuenta las &lt;a href=&quot;https://spencermortensen.com/articles/email-obfuscation/&quot; target=&quot;_blank&quot;&gt;técnicas de ofuscación de correo electrónico que siguen funcionando en 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El resto de contenidos interesantes, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/02/como-detectar-y-reaccionar-cambios-en.html&quot;&gt;Cómo detectar y reaccionar a cambios en settings de ASP.NET Core, en tiempo real&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/05/ambito-local-implicito-en-sentencias.html&quot;&gt;Ámbito local implícito en sentencias using de C#&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/03/29/tu-app-necesita-workers-silenciosos-el-patron-que-usa-amazon-para-no-hacerte-esperar/&quot;&gt;Tu App Necesita Workers Silenciosos: El Patrón que Usa Amazon para No Hacerte Esperar&lt;/a&gt; &amp;amp; * &lt;a href=&quot;https://bravedeveloper.com/2026/04/05/background-jobs-en-net-con-ihostedservice-procesa-tareas-en-segundo-plano/&quot;&gt;Background Jobs en .NET con IHostedService: Procesa Tareas en Segundo Plano&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/04/using-llms-and-mcp-in-net.html?m=1&quot;&gt;Using LLMs and MCP in .NET&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/configuring-contextual-options-with-microsoft-extensions-options-contextual/&quot;&gt;Configuring contextual options with Microsoft.Extensions.Options.Contextual&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/how-net-handles-exceptions-internally-and-why-theyre-expensive/&quot;&gt;How .NET handles exceptions internally (and why they&#39;re expensive)&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/url-pattern-matching-in-dotnet.htm&quot;&gt;URL Pattern Matching in .NET&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kant2002.github.io/en/obfuscators/2026/04/02/how-to-build-obfuscator-part-i.html&quot;&gt;How to build .NET obfuscator&lt;/a&gt;&lt;br /&gt;
Andrii Kurdiumov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/csharp-15-union-types/&quot;&gt;Explore union types in C# 15&lt;/a&gt;&lt;br /&gt;
Bill Wagner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/04/04/%f0%9f%93%9d-convert-anything-to-markdown-in-net-meet-elbruno-markitdotnet/&quot;&gt;Convert Anything to Markdown in .NET — Meet ElBruno.MarkItDotNet&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/3acc78ff-5ae2-4be3-af7e-62bfcbf3fb6d&quot;&gt;Source code generated string enums with exhaustion support&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/dotnet-11-preview-whats-new&quot;&gt;What’s New in .NET 11 Preview 1 &amp;amp; 2: Runtime Async, Zstandard, Blazor TempData, and Vector Search&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mteheran.dev/libraries-i-stopped-using-in-net-and-i-dont-regret-it-35f8679196c8&quot;&gt;Libraries I Stopped Using in .NET (And I Don’t Regret It)&lt;/a&gt;&lt;br /&gt;
Miguel Teherán&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anthonygiretti.com/2026/04/08/asp-net-core-why-i-couldnt-upgrade-fluentvalidation-past-11-4-in-my-calzolari-grpc-aspnetcore-validation-package-and-how-i-finally-fixed-it/&quot;&gt;ASP.NET Core: Why I Couldn’t Upgrade FluentValidation Past 11.4 in My Calzolari.Grpc.AspNetCore.Validation Package (and How I Finally Fixed It)&lt;/a&gt;&lt;br /&gt;
Anthony Giretti&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/08/testing-c-source-generators-a-practical-guide&quot;&gt;Testing C# Source Generators: A Practical Guide&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/load-save-image-blazor-image-editor-sql-server&quot;&gt;How to Load and Save Images in Blazor Image Editor with SQL Server&lt;/a&gt;&lt;br /&gt;
Satheeskumar S.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/instantiating-objects-accessing-properties-blazor&quot;&gt;Instantiating Objects and Accessing Properties in Blazor&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/aspnet-core-2-3-end-of-support/&quot;&gt;ASP.NET Core 2.3 end of support announcement&lt;/a&gt;&lt;br /&gt;
Daniel Roth&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/blazor-basics-building-responsive-blazor-apps-css-media-queries&quot;&gt;Blazor Basics: Building Responsive Blazor Apps with CSS Media Queries&lt;/a&gt;&lt;br /&gt;
Claudio Bernasconi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mitchelsellers.com/blog/article/using-blazor-sections-for-complex-situations&quot;&gt;Using Blazor Sections For Complex Situations&lt;/a&gt;&lt;br /&gt;
Mitchel Sellers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/dotnet/mastering-distributed-rate-limiting-asp-net-core/&quot;&gt;Mastering ASP.NET Core Rate Limiting: From Middleware to Distributed Redis Strategies&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/03/31/continued-investment.html&quot;&gt;Continued Investment in Azure App Service&lt;/a&gt;&lt;br /&gt;
Byron Tardif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/infrastructure-as-code-compliance-bicep/&quot;&gt;Why Your Azure Portal Clicks Will Fail the Next Audit&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/04/06/quickdeploy.html&quot;&gt;A simpler way to deploy your code to Azure App Service for Linux&lt;/a&gt;&lt;br /&gt;
Tulika Chaudharie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/04/09/Agentic_IIS_Migration_to_Managed_Instance_On_AppService.html&quot;&gt;Agentic IIS Migration to Managed Instance on Azure App Service&lt;/a&gt;&lt;br /&gt;
Gaurav Seth&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.developerro.com/2026/04/01/tyding-up-your-code/&quot;&gt;Tidying up your code&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/devops-para-principiantes-que-significan-dia-0-1-y-2-y-por-que-el-dia-2-puede-durar-cinco-anios.aspx&quot;&gt;DevOps para principiantes: ¿Qué significan Día 0, 1 y 2 y por qué el Día 2 puede durar cinco años?&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;Code Organization and Maintainability: &lt;a href=&quot;https://www.devleader.ca/2026/03/27/factory-method-pattern-best-practices-in-c-code-organization-and-maintainability&quot;&gt;Factory Method Pattern Best Practices in C#&lt;/a&gt; &amp;amp; * &lt;a href=&quot;https://www.devleader.ca/2026/04/01/observer-pattern-best-practices-in-c-code-organization-and-maintainability&quot;&gt;Observer Pattern Best Practices in C#&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/right-to-erasure-implementation-patterns/&quot;&gt;&quot;Just Delete the User&quot;: Famous Last Words Before the GDPR Audit&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://essenceia.github.io/projects/floating_dragon/&quot;&gt;Floating point from scratch: Hard Mode&lt;/a&gt;&lt;br /&gt;
Julia Desmazes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/04/un-hardening-tip-de-bbdd-de-mi-lost.html&quot;&gt;Un informático en el lado del mal: Un &quot;Hardening Tip&quot; de BBDD - de mi Lost &amp;amp; Found&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/why-your-entity-framework-core-app-needs-query-filters&quot;&gt;Why your Entity Framework Core app needs query filters&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/mapping-database-views-in-ef-core-without-breaking-migrations/&quot;&gt;Mapping database views in EF Core without breaking migrations&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/ef-core-transactions-stop-data-getting-out-of-sync&quot;&gt;EF Core transactions: Stop your data getting out of sync&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/how-to-delete-and-update-millions-of-rows-in-ef-core-without-loading-a-single-entity/&quot;&gt;How to Delete and Update Millions of Rows in EF Core Without Loading a Single Entity&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/la-ia-genera-deuda-tecnica-causas-riesgos-y-como-evitarlos-guia-completa-para-tecnicos.aspx&quot;&gt;¿La IA genera deuda técnica? Causas, riesgos y cómo evitarlos&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mariocortes.net/la-trampa-del-70-30-el-espejismo-del-rendimiento-cognitivo-en-la-era-de-la-ia/&quot;&gt;La trampa del 70/30: El espejismo del rendimiento cognitivo en la era de la IA&lt;/a&gt;&lt;br /&gt;
Mario Cortés&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/personas-y-agentes-colaboran-compiten-por-el-mismo-de-diaz-martin-vsh3e/&quot;&gt;Personas y agentes no colaboran. Compiten por el mismo cuello de botella&lt;/a&gt;&lt;br /&gt;
Alberto Díaz Martín&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/03/frontiermath-inteligencia-artificial.html&quot;&gt;FrontierMath: Inteligencia Artificial resolviendo problemas de matemáticas aún no resueltos&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elguerre.com/2026/03/30/ai-agents-vs-skills-commands-in-claude-code-codex-copilot-cli-gemini-cli-stop-mixing-them-up/&quot;&gt;AI Agents vs Skills (&amp;amp; Commands) in Claude Code, Codex, Copilot CLI &amp;amp; Gemini CLI: Stop Mixing Them&amp;nbsp;Up&lt;/a&gt;&lt;br /&gt;
Juan Luis Guerrero&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/rag-vs-fine-tuning-in-gpt-approach&quot;&gt;RAG vs Fine-Tuning: How to Choose the Right GPT Approach&lt;/a&gt;&lt;br /&gt;
Manikanda Akash Munisamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ploeh.dk/2026/03/30/programming-languages-for-ai/&quot;&gt;Programming languages for AI&lt;/a&gt;&lt;br /&gt;
Mark Seemann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/context-engineering-smart-ai-prompts&quot;&gt;Context Engineering: Improving AI Code Output in Your IDE&lt;/a&gt;&lt;br /&gt;
Kaviya Priya Rajakumar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/03/migrating-from-semantic-kernel-to-microsoft-agent-framework-in-c&quot;&gt;Migrating from Semantic Kernel to Microsoft Agent Framework in C#&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dirkstrauss.com/claude-code-windows-migration-guide/&quot;&gt;Claude Code Windows Migration Guide: Move Your Setup&lt;/a&gt;&lt;br /&gt;
Dirk Strauss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/top-llm-api-comparison-2026&quot;&gt;Best LLM APIs&amp;nbsp;in 2026: Comparing OpenAI, Claude, Gemini, Azure, Bedrock, Mistral &amp;amp; DeepSeek&lt;/a&gt;&lt;br /&gt;
Arunachalam Kandasamy Raja&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/&quot;&gt;Introducing SQL MCP Server&lt;/a&gt;&lt;br /&gt;
Jerry Nixon&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/form-automation-tips-for-happier-user-and-clients/&quot;&gt;Form Automation Tips for Happier User and Clients&lt;/a&gt;&lt;br /&gt;
Iqra Naaem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-drill-down-menu-with-details-and-scope/&quot;&gt;The Drill-Down Menu with Details and @scope&lt;/a&gt;&lt;br /&gt;
Preethi Sam&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csswizardry.com/2026/04/what-is-css-containment-and-how-can-i-use-it/&quot;&gt;What Is CSS Containment and How Can I Use It?&lt;/a&gt;&lt;br /&gt;
Harry Roberts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spencermortensen.com/articles/email-obfuscation/&quot;&gt;Email obfuscation: What works in 2026?&lt;/a&gt;&lt;br /&gt;
Spencer Mortensen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.i-programmer.info/programming/113-javascript/18770-jquery-4-reinventing-events.html&quot;&gt;jQuery 4 - Reinventing Events&lt;/a&gt;&lt;br /&gt;
Ian Elliot&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/complex-css-shapes-with-shape-function/&quot;&gt;Making Complex CSS Shapes Using shape()&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/&quot;&gt;What To Know in JavaScript (2026 Edition)&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/css-multi-column-layout-wrapping-features/&quot;&gt;New CSS Multi-Column Layout Features in Chrome&lt;/a&gt;&lt;br /&gt;
Abhishek Pratap Singh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/creating-puzzle-peices-in-css/&quot;&gt;Let’s Get Puzzled!&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.inngest.com/blog/hanging-promises-for-control-flow&quot;&gt;You can&#39;t cancel a JavaScript promise (except sometimes you can)&lt;/a&gt;&lt;br /&gt;
Aaron Harper&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/clipboard-operations-in-react-spreadsheet&quot;&gt;How to Implement Cut, Copy, and Paste Support in React Spreadsheet&lt;/a&gt;&lt;br /&gt;
Parthasarathy Ranjan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/alternatives-to-the-important-keyword/&quot;&gt;Alternatives to the !important Keyword&lt;/a&gt;&lt;br /&gt;
Saleh Mubashar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/name-only-containers-the-scoping-we-needed/&quot;&gt;Name-Only Containers: The Scoping We Needed&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sitr.us/2026/04/06/big-ideas-of-typescript.html/&quot;&gt;The 6 Big Ideas of Typescript • sitr.us&lt;/a&gt;&lt;br /&gt;
Jesse Hallett&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/selecting-a-date-range-in-css/&quot;&gt;Selecting a Date Range in CSS&lt;/a&gt;&lt;br /&gt;
Preethi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/svg-filters-guide-getting-started-with-the-basics/&quot;&gt;SVG Filters Guide: Getting Started with the Basics&lt;/a&gt;&lt;br /&gt;
Ana Tudor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/how-i-lost-madcss/&quot;&gt;How I Lost MadCSS&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/04/como-funciona-launch-json-vscode/&quot;&gt;Cómo funciona launch.json en VS Code: configuraciones, compounds y arranques secuenciales&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/&quot;&gt;OpenCode | El agente de codificación IA de código abierto&lt;/a&gt;&lt;br /&gt;
OpenCode Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/vibecodingpub/jetbrains-air-the-future-of-multi-agent-coding-or-just-more-ai-noise-5450e648a962&quot;&gt;JetBrains Air: The Future of Multi-Agent Coding, or Just More AI Noise?&lt;/a&gt;&lt;br /&gt;
Saeed Zarinfam&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/&quot;&gt;Visual Studio March Update - Build Your Own Custom Agents&lt;/a&gt;&lt;br /&gt;
Mark Downie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/&quot;&gt;Bookmark Studio: evolving bookmarks in Visual Studio&lt;/a&gt;&lt;br /&gt;
Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/&quot;&gt;Your Migration&#39;s Source of Truth: The Modernization Assessment&lt;/a&gt;&lt;br /&gt;
Jeffrey Fritz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/running-ai-agents-safely-in-a-microvm-using-docker-sandbox/&quot;&gt;Running AI agents safely in a microVM using docker sandbox&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.postman.com/how-to-mock-apis-locally-during-development/&quot;&gt;How to Mock APIs Locally During Development&lt;/a&gt;&lt;br /&gt;
Quinton Wall&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/universal-doc-viewing-maui-pdf-viewer&quot;&gt;Tired of Multiple Viewers? Build a Universal Document Viewer in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Deepak G.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/speed-up-dotnet-maui-popup&quot;&gt;Why .NET MAUI Popups Lag and How to Fix Performance Issues&lt;/a&gt;&lt;br /&gt;
Kompelli Sravan Kumar Kompelli Lakshman&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/redefining-software-engineering-profession-gy74e/&quot;&gt;Redefining the Software Engineering Profession for AI&lt;/a&gt;&lt;br /&gt;
Mark Russinovich &amp;amp; Scott Hanselman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/3837292177887920600/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/3837292177887920600' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3837292177887920600'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3837292177887920600'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/04/enlaces-interesantes-643.html' title='Enlaces interesantes 643'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBAupKEqFdp5SuckJABdQd8rgHx2vNY1mcdiJYXdrV4lHeWWlcaewgAhUNWSXkgqwCg1uGJnGE6GpHZFw9KEg-Lz_DkfIs9MYvsWpPr2-iecyqXtybzpV5vnI0eToeBcfyyLJnPlYzmouqKQYBHc-o0GgbCzKe1BGUV7AMxRYOYZ0Zvo5-I1aC5g/s72-c/ia-tech-debt.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-699572947616277491</id><published>2026-03-30T08:02:00.001+02:00</published><updated>2026-03-30T08:02:00.123+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 643</title><content type='html'>&lt;img alt=&quot;Dos policías arrestando a un desarrollador que estaba usando una IA para generar su código&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjswXYBJ2wj0x55d5vp9hjgo65jA6J5yE6wbOOIM2GW6NevtVzF_djzmgT2ZXFTlKgyLY2XhYzAbhGJfz2M-6ahSZC3ylbOU9Njw4dI930iscW3PzQ6j9siPdcKOFoQbHVWK_OYl8gJv9tGwtfBLjBTeIpykYADqevrRp31jBur5g4bArGq7btVmg/s800/arrested.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Pues nos vamos de Semana Santa con unos cuantos enlaces interesantes para entretenernos durante las vacaciones, en caso de haberlas 😎&lt;/p&gt;
&lt;p&gt;Y como siempre me gusta destacar algunos, comencemos por Mark Seemann, que trata un tema algo controvertido, pero interesante: si usamos agentes IA para generar nuestro código sin supervisión, ¿quién es responsable de ese código? ¿&lt;a href=&quot;https://blog.ploeh.dk/2026/03/23/will-you-go-to-prison-for-an-ai/&quot; target=&quot;_blank&quot;&gt;podríamos ir a prisión por un código generado por una IA&lt;/a&gt;? Spoiler: ándate con cuidado, por si acaso.&lt;/p&gt;
&lt;p&gt;José Manuel Alarcón nos cuenta esta semana &lt;a href=&quot;https://www.campusmvp.es/recursos/post/proyectos-greenfield-y-brownfield-en-software.aspx&quot; target=&quot;_blank&quot;&gt;qué son los proyectos greenfield y brownfield&lt;/a&gt;, términos usados últimamente con mucha frecuencia. Y de paso, también nos envía una llamada de atención sobre &lt;a href=&quot;https://www.campusmvp.es/recursos/post/github-copilot-como-evitar-que-use-tu-codigo-para-entrenar-sus-modelos.aspx&quot; target=&quot;_blank&quot;&gt;el cambio de política de datos de GitHub&lt;/a&gt;, que les permitirá en poco tiempo utilizar nuestro código para entrenar a sus modelos de IA, y nos cuenta cómo evitarlo.&lt;/p&gt;
&lt;p&gt;Daniel Rosenwasser ha &lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/&quot; target=&quot;_blank&quot;&gt;anunciado TypeScript 6.0&lt;/a&gt;, la última versión del lenguaje antes de dar el esperado salto a Go, previsto para TypeScript 7.0. En esta nueva versión se han incluido mejoras en el lenguaje y el sistema de tipos y soporte para nuevas APIs.&lt;/p&gt;
&lt;p&gt;Nick Cosentino nos lleva a las bases explicando las &lt;a href=&quot; https://www.devleader.ca/2026/03/23/singleton-vs-static-class-in-c-key-differences-explained&quot; target=&quot;_blank&quot;&gt;diferencias entre el patrón Singleton y las clases estáticas en C#&lt;/a&gt; y cuándo deberíamos usarlas.&lt;/p&gt;
&lt;p&gt;Y la frikada de la semana la encontramos en el blog de Chema Alonso, que nos cuenta cómo es posible &lt;a href=&quot;https://www.elladodelmal.com/2026/03/doom-over-dns-o-como-guardar-descarga-y.html&quot; target=&quot;_blank&quot;&gt;guardar, descargar y ejecutar el juego Doom desde el DNS de Cloudflare&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El resto de enlaces a contenidos que no puedes perderte, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/02/forzar-casts-imposibles-con-c.html&quot;&gt;Forzar casts imposibles con C#&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/05/constructores-con-parametros-en.html&quot;&gt;Constructores con parámetros en entidades EF Core&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/03/22/feature-flags-en-net-controla-tu-codigo-sin-hacer-deploy/&quot;&gt;Feature Flags en .NET: Controla tu Código Sin Hacer Deploy&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/03/23/singleton-vs-static-class-in-c-key-differences-explained&quot;&gt;Singleton vs Static Class in C#: Key Differences Explained&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dirkstrauss.com/solid-principles-in-csharp/&quot;&gt;SOLID Principles in C#: Beginner Guide with .NET Examples&lt;/a&gt;&lt;br /&gt;
Dirk Strauss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/split-dotnet-test-projects-into-shards-with-meziantou-shardedtest.htm&quot;&gt;Speed Up .NET CI with Test Sharding&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.code4it.dev/csharptips/json-serialize-deserialize-dates/&quot;&gt;C# Tip: How to JSON Serialize and Deserialize values as DateTime, DateTimeOffset, DateOnly and TimeOnly&lt;/a&gt;&lt;br /&gt;
Davide Bellone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabsoverspaces.com/233966-introducing-ntptick-a-lightweight-ntp-client-for-dotnet&quot;&gt;Introducing NtpTick: A lightweight NTP client for .NET&lt;/a&gt;&lt;br /&gt;
Jiří Činčura&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260324-improving-dotnet-security-code-with-csharp-14-property-extensions&quot;&gt;Improving .NET Security Code with C# 14 Property Extensions&lt;/a&gt;&lt;br /&gt;
Wesley Cabus&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/excel-ai-translator-csharp-openai&quot;&gt;Build an AI-Powered Excel Translator in C# Using OpenAI and XlsIO&lt;/a&gt;&lt;br /&gt;
Mohan Chandran&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/03/compile-time-options-validation-with.html&quot;&gt;Compile-Time options validation with the OptionsValidator source generator&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/03/generating-structured-code-using-azure.html&quot;&gt;Generating Structured Code Using Azure, OpenAI and .NET&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/03/08/versionamiento-de-apis-conceptos-estrategias-y-trade-offs/&quot;&gt;Versionamiento de APIs: conceptos, estrategias y trade-offs&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://bravedeveloper.com/2026/03/15/versionamiento-de-apis-en-net-guia-practica-de-implementacion/&quot;&gt;Versionamiento de APIs en .NET: guía práctica de implementación&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/designing-business-rules-that-dont-leak-into-controllers/&quot;&gt;Designing business rules that don&#39;t leak into controllers&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/privacy-health-checks-data-access-patterns/&quot;&gt;Privacy Health Checks: Beyond Database Connectivity&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/aspnetcore-output-cache-how-to-speed-up-your-api-with-in-memory-cache-and-redis&quot;&gt;ASP.NET Core Output Cache: How to Speed Up Your API with In-Memory Cache and Redis&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/03/01/top-3-errores-comunes-al-hacer-apis-en-net-y-como-evitarlos/&quot;&gt;Top 3 Errores comunes al hacer APIs en .NET (y cómo evitarlos)&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/scaling-signalr-with-redis-backplane&quot;&gt;Scaling SignalR With a Redis Backplane&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/aspire/aspire-13-2-announcement/&quot;&gt;Announcing Aspire 13.2&lt;/a&gt;&lt;br /&gt;
Maddy Montaquila&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodogmablog.bryanhogan.net/2026/03/a-simple-net-cli-web-server/&quot;&gt;A Simple .NET CLI Web Server&lt;/a&gt;&lt;br /&gt;
Bryan Hogan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/03/24/build-an-aspnet-core-ai-assistant-api-with-github-copilot-sdk-in-c&quot;&gt;Build an ASP.NET Core AI Assistant API with GitHub Copilot SDK in C#&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/whats-new-blazor-net-11-preview-releases-1-2&quot;&gt;What’s New for Blazor in .NET 11 Preview Releases 1 and 2&lt;/a&gt;&lt;br /&gt;
Jon Hilton&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/03/25/Aspire-GA.html&quot;&gt;Aspire on Azure App Service is now Generally Available&lt;/a&gt;&lt;br /&gt;
Tulika Chaudharie&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://preview.developer.vonage.com/en/blog/what-are-websockets-and-how-are-they-different-from-http&quot;&gt;What Are WebSockets and How Are They Different From HTTP?&lt;/a&gt;&lt;br /&gt;
Liz Acosta&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/continuous-deployment-security-gates/&quot;&gt;Stop Deploying Garbage to Production&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11644/composite-index-in-sql-server/&quot;&gt;Composite Index SQL: How to Improve Query Speed&lt;/a&gt;&lt;br /&gt;
Deepak Vohra&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azuredbsupport/cpu-percentage-vs-sql-instance-cpu-percent-the-portal%E2%80%99s-favorite-misunderstandin/4503765&quot;&gt;CPU percentage vs SQL instance CPU percent: The Portal’s Favorite Misunderstanding&lt;/a&gt;&lt;br /&gt;
Shaurya Singh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/how-to-work-with-dapper-in-net/&quot;&gt;How to Work With Dapper in .Net&lt;/a&gt;&lt;br /&gt;
Grant Riordan&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/cuando-la-ia-intenta-arreglar-el-mismo-bug-diez-veces-diaz-martin-pgw0e/&quot;&gt;Cuando la IA intenta arreglar el mismo bug diez veces… el problema ya no es el bug&lt;/a&gt;&lt;br /&gt;
Alberto Díaz Martín&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/tips-y-buenas-pr%C3%A1cticas-usando-ia-juan-irigoyen-ap8oe/&quot;&gt;Tips y buenas prácticas usando IA&lt;/a&gt;&lt;br /&gt;
Juan Irigoyen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/ten-months-with-cca-in-dotnet-runtime/&quot;&gt;Ten Months with Copilot Coding Agent in dotnet/runtime&lt;/a&gt;&lt;br /&gt;
Ron Darziv&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ploeh.dk/2026/03/23/will-you-go-to-prison-for-an-ai/&quot;&gt;Will you go to prison for an AI?&lt;/a&gt;&lt;br /&gt;
Mark Seemann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/03/27/stop-wasting-tokens-smart-tool-routing-for-llms-with-mcptoolrouter/&quot;&gt;Stop Wasting Tokens: Smart Tool Routing for LLMs with MCPToolRouter&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript / Design&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/&quot;&gt;Announcing TypeScript 6.0&lt;/a&gt;&lt;br /&gt;
Erkan Okman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/redux-vs-zustand-react-state-management&quot;&gt;Redux vs Zustand: Choosing the Right React State Manager&lt;/a&gt;&lt;br /&gt;
Manikanda Akash Munisamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/experimenting-with-scroll-driven-corner-shape-animations/&quot;&gt;Experimenting With Scroll-Driven corner-shape Animations&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/two-circles-one-arrow-and-anchor-positioning/&quot;&gt;Two Circles, One Arrow, and Anchor Positioning&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/shadow-dom-focus-delegation-getting-delegatesfocus-right/&quot;&gt;Shadow DOM Focus Delegation: Getting&amp;nbsp;delegatesFocus&amp;nbsp;Right&lt;/a&gt;&lt;br /&gt;
Rob Levin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/03/testing-font-scaling-accessibility-figma-variables/&quot;&gt;Testing Font Scaling For Accessibility With Figma Variables&lt;/a&gt;&lt;br /&gt;
Ruben Ferreira Duarte&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://debugmode.net/2026/03/26/contravariance-on-typescript-function-parameters/&quot;&gt;Contravariance on TypeScript Function&amp;nbsp;Parameters&lt;/a&gt;&lt;br /&gt;
Dhananjay Kumar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/github-copilot-como-evitar-que-use-tu-codigo-para-entrenar-sus-modelos.aspx&quot;&gt;¿Tu IA aprende de ti?: Cómo evitar que GitHub Copilot use tu código para entrenar a sus modelos&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/03/dependabot-te-dice-que-es-vulnerable-pero-es-explotable-de-verdad/&quot;&gt;Dependabot te dice que es vulnerable… ¿pero es explotable de verdad?&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/dotnet/2026/03/20/resharper-2026-1-release-candidate/&quot;&gt;ReSharper 2026.1 Release Candidate Released!&lt;/a&gt;&lt;br /&gt;
Sasha Ivanova&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/syncfusion-essential-studio-ui-edition-dev-essentials&quot;&gt;Essential Studio UI Edition Now Available For Dev Essentials Subscribers&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.syncfusion.com/blogs/post/syncfusion-essential-studio-enterprise-edition&quot;&gt;Essential Studio Enterprise Edition Now Available For Select Visual Studio Enterprise and Professional Subscribers&lt;/a&gt;&lt;br /&gt;
Meena Alagiah&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dirkstrauss.com/visual-studio-shortcuts/&quot;&gt;Visual Studio Shortcuts: Complete Guide to Coding Faster&lt;/a&gt;&lt;br /&gt;
Dirk Strauss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://haacked.com/archive/2026/03/25/resolve-merge-conflicts/&quot;&gt;Resolve Merge Conflicts the Easy Way&lt;/a&gt;&lt;br /&gt;
Phil Haack&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://textslashplain.com/2026/03/24/windows-choose-where-to-get-apps/&quot;&gt;Windows: Choose Where To Get&amp;nbsp;Apps&lt;/a&gt;&lt;br /&gt;
Eric Lawrence&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/proyectos-greenfield-y-brownfield-en-software.aspx&quot;&gt;¿Qué son los proyectos greenfield y brownfield en software (y por qué se oyen tanto, también en España)?&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/03/doom-over-dns-o-como-guardar-descarga-y.html&quot;&gt;Doom over DNS: O cómo guardar, descargar y ejecutar Doom desde el DNS (de Cloudflare)&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260324-00/?p=112159&quot;&gt;Windows 95 defenses against installers that overwrite a file with an older version&lt;/a&gt;&lt;br /&gt;
Raymond Chen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devlead.se/posts/2026/2026-03-22-quarter-billion-nuget-downloads&quot;&gt;A quarter of a billion NuGet downloads&lt;/a&gt;&lt;br /&gt;
Mattias Karlsson&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/699572947616277491/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/699572947616277491' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/699572947616277491'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/699572947616277491'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/enlaces-interesantes-643.html' title='Enlaces interesantes 643'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjswXYBJ2wj0x55d5vp9hjgo65jA6J5yE6wbOOIM2GW6NevtVzF_djzmgT2ZXFTlKgyLY2XhYzAbhGJfz2M-6ahSZC3ylbOU9Njw4dI930iscW3PzQ6j9siPdcKOFoQbHVWK_OYl8gJv9tGwtfBLjBTeIpykYADqevrRp31jBur5g4bArGq7btVmg/s72-c/arrested.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-572769011502028625</id><published>2026-03-23T08:02:00.029+01:00</published><updated>2026-03-23T08:02:00.112+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 642</title><content type='html'>&lt;img alt=&quot;Doctor diseccionando un robot para conocer su anatomía&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJSOTvYPiln0iLA1qktKZKeD3JxR9-H1zXV_A1pXhaRkNO45iaqzEzL_ueUSnDqQ5jam5pZ9sWml_TfW-6z7ebQ4YimbnwZ8VM6Mx8Z9moRkZiXKzesjxBO46uZEzPQsYAadbLvOB3-Jzvh3GoyNtQwJmrHPaSRpOZaXhv2hEwGt1Xw8MwmFGxTw/s800/agent-anatomy.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;La semana pasada encontré gran cantidad de contenidos interesantes sobre desarrollo web, .NET, IA, acceso a datos, MAUI y otros temas, aunque me gustaría destacar varios artículos, todos relacionados con la inteligencia artificial, a los que, como mínimo, deberías echarles un vistazo.&lt;/p&gt;
&lt;p&gt;En primer lugar, Fernando Escolar nos explica detalladamente las&amp;nbsp;&lt;a href=&quot;https://www.developerro.com/2026/03/18/anatomia-agente-ia/&quot; target=&quot;_blank&quot;&gt;distintas piezas que componen un agente de IA&lt;/a&gt;, y cómo se relacionan entre sí.&lt;/p&gt;&lt;div&gt;Braulio Díez, &lt;a href=&quot;https://www.youtube.com/watch?v=Y6ZuGI1jgfs&quot; target=&quot;_blank&quot;&gt;citando a Sabina&lt;/a&gt;, reflexiona sobre &lt;a href=&quot;https://elbraulio.net/posts/subvencioname-un-pico-de-ia&quot; target=&quot;_blank&quot;&gt;el modelo de negocio de los proveedores de IA&lt;/a&gt; como OpenAI o Anthropic, y cómo pueden permitirse perder cantidades ingentes de dinero en sus operaciones, en busca de un beneficio futuro astronómico.&lt;/div&gt;
&lt;p&gt;Miguel Durán comparte un proyecto personal que ha creado para &lt;a href=&quot;https://www.canirun.ai/&quot; target=&quot;_blank&quot;&gt;comprobar qué modelos de IA podemos ejecutar en nuestra máquina&lt;/a&gt; local, muy útil para usar IA generativa sin pasar por caja y sin enviar datos hacia fuera.&lt;/p&gt;
&lt;p&gt;Por último, Addy Osmani nos habla de la &lt;a href=&quot;https://medium.com/@addyosmani/comprehension-debt-the-hidden-cost-of-ai-generated-code-285a25dac57e&quot; target=&quot;_blank&quot;&gt;deuda de comprensión que se genera al usar código generado por IA&lt;/a&gt;, y cómo esto puede afectar a los desarrolladores a largo plazo.&lt;/p&gt;
&lt;p&gt;El resto de enlaces, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/02/aprovecha-al-maximo-los-archivos-http.html&quot;&gt;Aprovecha al máximo los archivos .http en Visual Studio usando variables dinámicas&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/05/backing-fields-en-entity-framework-core.html&quot;&gt;Backing fields en Entity Framework Core&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/c-sharp-class-types-explained-examples&quot;&gt;C# class types explained with examples&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/adospace/CoreSync&quot;&gt;CoreSync: a .NET library that provides data synchronization between databases&lt;/a&gt;&lt;br /&gt;
Adolfo Marinucci&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/9be39ff1-b7fc-4814-abd4-5ea41a07f8d7&quot;&gt;records ToString and inheritence&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/implementing-rfc-compliant-http-caching-for-httpclient-in-dotnet.htm&quot;&gt;Implementing RFC-compliant HTTP caching for HttpClient in .NET&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dirkstrauss.com/csharp-14-new-features-dotnet-10/&quot;&gt;C# 14 New Features: A Developer Guide for .NET 10&lt;/a&gt;&lt;br /&gt;
Dirk Strauss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://minidump.net/writing-a-net-gc-in-c-part-9/&quot;&gt;Writing a .NET Garbage Collector in C#  - Part&amp;nbsp;9: Frozen segments and new allocation strategy&lt;/a&gt;&lt;br /&gt;
Kevin Gosse&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/03/19/%f0%9f%a4%96-local-llm-chat-completions-in-net-just-c/&quot;&gt;Local LLM Chat Completions in .NET — Just C#&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/03/implementing-strategy-pattern-with-net.html&quot;&gt;Implementing the Strategy Pattern with .NET Dependency Injection&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/code-blocks-in-blazor-rich-text-editor&quot;&gt;Code Blocks in Blazor Rich Text Editor: Setup and Best Practices&lt;/a&gt;&lt;br /&gt;
Saravanan G.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/blazor-basics-implementing-theme-switch-blazor-dark-mode&quot;&gt;Blazor Basics: Implementing a Theme Switch in Blazor (Dark Mode)&lt;/a&gt;&lt;br /&gt;
Claudio Bernasconi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/health-checks-operational-monitoring/&quot;&gt;Green Dashboard, Dead Application&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/backup-recovery-azure-sql-database/&quot;&gt;Your Azure SQL Backups Won&#39;t Save You (Here&#39;s Why)&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shankuehn.io/post/lost-your-ssh-key-to-an-azure-vm-don-t-panic-here-s-the-fix&quot;&gt;Lost Your SSH Key to an Azure VM? Don’t Panic. Here’s the Fix.&lt;/a&gt;&lt;br /&gt;
Shannon B. Kuehn&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thomasmaurer.ch/2026/03/how-to-evaluate-test-and-demo-azure-local/&quot;&gt;How to Evaluate, Test, and Demo Azure Local&lt;/a&gt;&lt;br /&gt;
Thomas Maurer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://navegapolis.com/website/scrum-en-la-era-de-la-ia-la-sintesis-que-viene/&quot;&gt;Scrum en la era de la IA: la síntesis que viene&lt;/a&gt;&lt;br /&gt;
Juan Palacio Bañeres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/03/14/decorator-design-pattern-in-c-complete-guide-with-examples&quot;&gt;Decorator Design Pattern in C#: Complete Guide with Examples&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.manager.dev/p/the-unwritten-laws-of-software-engineering&quot;&gt;The unwritten laws of software engineering&lt;/a&gt;&lt;br /&gt;
Anton Zaides&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bigmachine.io/articles/ai/look-bro-i-know-how-to-write-good-code/&quot;&gt;Look Bro, I Know How to Write Good Code&lt;/a&gt;&lt;br /&gt;
Rob Conery&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/03/how-to-seed-data-to-ef-core.html&quot;&gt;How to Seed Data to EF Core&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.c-sharpcorner.com/article/dapper-in-depth-with-asp-net-core-10/&quot;&gt;Dapper in Depth with ASP.NET Core 10&lt;/a&gt;&lt;br /&gt;
Soumyadip Majumder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/optimizing-bulk-database-updates-in-dotnet&quot;&gt;Optimizing Bulk Database Updates in .NET: From Naive to Lightning-Fast&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/when-not-to-use-the-repository-pattern-in-ef-core/&quot;&gt;When NOT to use the repository pattern in EF Core&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/entity-framework-extensions-options-explained&quot;&gt;Entity Framework Extensions Options Explained: Everything You Can Customize&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11638/make-deployable-sql-scripts-idempotent/&quot;&gt;Deploy SQL Scripts Effectively in Production&lt;/a&gt;&lt;br /&gt;
Jared Westover&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/microsoft-data-sqlclient-7-0-is-here-a-leaner-more-modular-driver-for-sql-server/4503173&quot;&gt;Microsoft.Data.SqlClient 7.0 Is Here: A Leaner, More Modular Driver for SQL Server&lt;/a&gt;&lt;br /&gt;
David Levy&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://elbraulio.net/posts/subvencioname-un-pico-de-ia&quot;&gt;Subvencioname un pico de IA&lt;/a&gt;&lt;br /&gt;
Braulio Díez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.developerro.com/2026/03/18/anatomia-agente-ia/&quot;&gt;Anatomía de un agente de IA&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.canirun.ai/&quot;&gt;CanIRun.ai — Can your machine run AI models?&lt;/a&gt;&lt;br /&gt;
Miguel Durán&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-openai%E2%80%99s-gpt-5-4-mini-and-gpt-5-4-nano-for-low-latency-ai/4500569&quot;&gt;Introducing OpenAI’s GPT-5.4 mini and GPT-5.4 nano for low-latency AI&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/agent-framework/whats-new-in-agent-skills-code-skills-script-execution-and-approval-for-python/&quot;&gt;What&#39;s New in Agent Skills: Code Skills, Script Execution, and Approval for Python&lt;/a&gt;&lt;br /&gt;
Sergey Menshykh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/03/18/random-forest-regression-using-csharp.aspx&quot;&gt;Random Forest Regression Using C#&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ardalis.com/ai-benefits---but-at-what-cost/&quot;&gt;AI Benefits - But at What Cost?&lt;/a&gt;&lt;br /&gt;
Steve Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://costlyinfra.com/blog/how-large-language-models-are-built-and-work&quot;&gt;How Large Language Models Are Built and Work — Complete Technical Guide&lt;/a&gt;&lt;br /&gt;
CostlyInfra&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://medium.com/@addyosmani/comprehension-debt-the-hidden-cost-of-ai-generated-code-285a25dac57e&quot;&gt;Comprehension Debt — the hidden cost of AI generated code&lt;/a&gt;&lt;br /&gt;Addy Osmani&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript / Frontend&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.enmilocalfunciona.io/angular-hacia-la-programacion-funcional/&quot;&gt;Angular 16 y programación funcional para código limpio&lt;/a&gt;&lt;br /&gt;
David Filipe Lopes Domingues&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alvaromontoro.com/blog/68092/native-random-values-in-css&quot;&gt;Native Random Values in CSS&lt;/a&gt;&lt;br /&gt;
Alvaro Montoro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/4-reasons-that-make-tailwind-great-for-building-layouts/&quot;&gt;4 Reasons That Make Tailwind Great for Building Layouts&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://piccalil.li/blog/building-dynamic-toggletips-using-anchored-container-queries/&quot;&gt;Building dynamic toggletips using anchored container queries&lt;/a&gt;&lt;br /&gt;
Daniel Schwartz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/flexbox-masonry-layout-explained-with-math/&quot;&gt;Flexbox Masonry Layout (Explained with Math)&lt;/a&gt;&lt;br /&gt;
Ibrahim Bendebka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://basewatch.dev/&quot;&gt;BaseWatch — Track CSS &amp;amp; Browser Feature Support, Get Baseline Alerts&lt;/a&gt;&lt;br /&gt;
Filippo Tinnirello&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/javascript-for-everyone-destructuring/&quot;&gt;JavaScript for Everyone: Destructuring&lt;/a&gt;&lt;br /&gt;
Mat Marquis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/image-gallery-with-popovers-and-aim-anchor-interpolated-morph/&quot;&gt;Image Gallery with Popovers and AIM (Anchor-Interpolated Morph)&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/03/modal-separate-page-ux-decision-tree/&quot;&gt;Modal vs. Separate Page: UX Decision Tree&lt;/a&gt;&lt;br /&gt;
Vitaly Friedman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timdeschryver.dev/blog/introducing-angular-testing-library-zoneless&quot;&gt;Introducing Angular Testing Library Zoneless&lt;/a&gt;&lt;br /&gt;
Tim Deschryver&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/text-scaling-support-in-chrome-canary/&quot;&gt;Text scaling support in Chrome Canary&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/03/dropdowns-scrollable-containers-why-break-how-fix/&quot;&gt;Dropdowns Inside Scrollable Containers: Why They Break And How To Fix Them Properly&lt;/a&gt;&lt;br /&gt;
Godstime Aburu&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/awesome-github-copilot-just-got-a-website-and-a-learning-hub-and-plugins&quot;&gt;Awesome GitHub Copilot just got a website, and a learning hub, and plugins!&lt;/a&gt;&lt;br /&gt;
Matt Soucoup&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/blogs/2026/03/13/how-VS-Code-Builds-with-AI&quot;&gt;How VS Code Builds with AI&lt;/a&gt;&lt;br /&gt;
Pierce Boggan&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://avaloniaui.net/blog/maui-avalonia-preview-1&quot;&gt;MAUI Avalonia Preview 1&lt;/a&gt;&lt;br /&gt;
Tim Miller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/&quot;&gt;Pin Clustering in .NET MAUI Maps&lt;/a&gt;&lt;br /&gt;
David Ortinau&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/accessibility-net-maui-what-how-to-implement&quot;&gt;How to Implement Accessibility in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rajapet.com/2026/03/18/veryactivedebugprofile/&quot;&gt;When Visual Studio Forgets Your Phone: Building an Automated Solution&lt;/a&gt;&lt;br /&gt;
Chris Miller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ostebaronen.dk/2026/03/logging-in-maui-apps.html&quot;&gt;Logging in .NET MAUI Apps&lt;/a&gt;&lt;br /&gt;
Tomasz Cielecki&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/accelerating-dotnet-maui-with-ai-agents/&quot;&gt;Accelerating .NET MAUI Development with AI Agents&lt;/a&gt;&lt;br /&gt;
Agus Riyadi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/extract-data-from-pdf-dotnet-maui-ios&quot;&gt;How to Extract Data from PDFs in .NET MAUI iOS Apps Using C#&lt;/a&gt;&lt;br /&gt;
Sumathi Uthayakumar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/blazor-hybrid-pdf-viewer-winforms-wpf-maui&quot;&gt;Build Once, Run Everywhere: Blazor Hybrid PDF Viewer for WinForms, WPF, and .NET MAUI&lt;/a&gt;&lt;br /&gt;
Parthipan R.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/java-26-menos-es-mas-guia-completa-de-novedades-para-desarrolladores.aspx&quot;&gt;Java 26: menos es más — Guía completa de novedades para desarrolladores&lt;/a&gt;&lt;br /&gt;
CampusMVP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/572769011502028625/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/572769011502028625' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/572769011502028625'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/572769011502028625'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/enlaces-interesantes-642.html' title='Enlaces interesantes 642'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJSOTvYPiln0iLA1qktKZKeD3JxR9-H1zXV_A1pXhaRkNO45iaqzEzL_ueUSnDqQ5jam5pZ9sWml_TfW-6z7ebQ4YimbnwZ8VM6Mx8Z9moRkZiXKzesjxBO46uZEzPQsYAadbLvOB3-Jzvh3GoyNtQwJmrHPaSRpOZaXhv2hEwGt1Xw8MwmFGxTw/s72-c/agent-anatomy.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7618447111229845268</id><published>2026-03-17T08:02:00.000+01:00</published><updated>2026-03-17T08:02:00.118+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><title type='text'>¡Ojo a los parámetros IEnumerable&amp;lt;T&amp;gt;!</title><content type='html'>&lt;img alt=&quot;Desarrollador tomando muchas precauciones al trabajar con un método que recibe un parámetro IEnumerable&amp;lt;int&amp;gt;&quot; class=&quot;main-post-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJRZ3O-Y9cRmpojpLFxFWZpfGynNAF57QZgQMISplKPOVMO0d-8pelxjz4PaL62CP8DhkvtQiM9hVYihK5NsFIt-zDUdjYch2EKXsK2JrYUYqZfUzcE3TyhCzhpSXtkgrIAJXeYMb8XXadsxQpuZWSrwM5URzJgD4oWtxLkf3XWdhvz9SQ5g8fgg/s800/ienumerable.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;En .NET, es bastante habitual que nuestros métodos o funciones reciban objetos de tipo &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; con la intención de que iteremos sobre ellos para lograr el comportamiento deseado. Esta abstracción es muy poderosa, ya que nos permite trabajar con cualquier colección o secuencia de datos sin preocuparnos por su implementación concreta, pero, si no somos cuidadosos, puede llevarnos a errores y comportamientos inesperados.&lt;/p&gt;
&lt;p&gt;Por ejemplo, es muy frecuente realizar múltiples enumeraciones sobre la misma instancia de &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;, algo que a veces puede ocurrir de forma inconsciente, y se convierte en un problema cuando la secuencia es muy extensa o su contenido no es replicable. De hecho, muchas herramientas y entornos de desarrollo nos advierten sobre este problema durante la edición y compilación para que estemos atentos.&lt;/p&gt;
&lt;p&gt;Otro problema común es asumir que la secuencia es finita, algo que no tiene por qué ser siempre cierto. Las enumeraciones en este caso pueden llevar a bucles infinitos o a un consumo excesivo de recursos.&lt;/p&gt;
&lt;p&gt;En este artículo exploraremos distintos escenarios que pueden darse y cómo podemos evitarlos.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;¿Qué es una enumeración múltiple?&lt;/h2&gt;
&lt;p&gt;Una enumeración múltiple ocurre cuando &lt;strong&gt;un método o función recorre una secuencia de datos más de una vez&lt;/strong&gt;. Esto puede suceder de forma explícita, por ejemplo, si tenemos dos bucles &lt;code&gt;foreach&lt;/code&gt; que iteran sobre la misma secuencia, o de forma implícita, como cuando llamamos a varios métodos como &lt;code&gt;Count()&lt;/code&gt;, &lt;code&gt;ToList()&lt;/code&gt;, &lt;code&gt;Last()&lt;/code&gt;, etc. sobre la misma colección.&lt;/p&gt;
&lt;p&gt;Cuando se trata de una colección en memoria, como una lista o un array, no suele haber problema al realizar enumeraciones múltiples, ya que estas estructuras permiten recorrerlas tantas veces como sea necesario sin incurrir en un coste significativo.&lt;/p&gt;
&lt;p&gt;Sin embargo, si la secuencia es generada dinámicamente, como una consulta LINQ a una base de datos o aquellas producidas por un iterador, cada operación de enumeración puede implicar un &lt;strong&gt;coste considerable, tanto en términos de rendimiento como de recursos&lt;/strong&gt;, lo que hace que la enumeración múltiple pueda ser problemática.&lt;/p&gt;
&lt;p&gt;Pero además, el contenido de la secuencia puede variar entre distintas enumeraciones, lo que puede llevar a resultados inconsistentes o errores inesperados. Es lo que llamamos &quot;secuencias no replicables&quot;.&lt;/p&gt;
&lt;h2&gt;¿Qué es una secuencia no replicable?&lt;/h2&gt;
&lt;p&gt;Una secuencia no replicable es aquella que &lt;strong&gt;no puede ser recorrida múltiples veces de manera segura&lt;/strong&gt;. Un ejemplo típico es una consulta LINQ que se ejecuta contra una base de datos, datos procedentes de un &lt;em&gt;stream&lt;/em&gt; o una secuencia generada por un iterador que produce valores bajo demanda. En ninguno de esos casos podemos garantizar que la secuencia se mantenga igual entre diferentes enumeraciones, o incluso que esté disponible para una segunda enumeración (por ejemplo, los datos podrían haber cambiado en la base de datos).&lt;/p&gt;
&lt;p&gt;Por ejemplo, observad una función como la siguiente, que recibe un objeto &lt;code&gt;IEnumerable&amp;lt;int&amp;gt;&lt;/code&gt;, muestra el número de elementos recibidos e itera dos veces sobre ellos para procesarlos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static void Process(IEnumerable&amp;lt;int&amp;gt; numbers)
{
    Console.WriteLine($&quot;Processing {numbers.Count()} numbers&quot;);
    Console.WriteLine(&quot;First pass&quot;);
    foreach (var number in numbers)
    {
        Console.WriteLine($&quot;  Doing something with {number}&quot;);
        DoSomething(number);
    }

    Console.WriteLine(&quot;Second pass&quot;);
    foreach (var number in numbers)
    {
        Console.WriteLine($&quot;  Doing another thing with {number}&quot;);
        DoAnotherThing(number);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si el objeto enviado a la función &lt;code&gt;Process()&lt;/code&gt; se encontraba ya en memoria, por ejemplo en forma de una lista (&lt;code&gt;List&amp;lt;int&amp;gt;&lt;/code&gt;) o array (&lt;code&gt;int[]&lt;/code&gt;), el código anterior funcionará sin problemas. La ejecución será consistente y predecible, los elementos se contarán de forma correcta y ambos bucles &lt;code&gt;foreach&lt;/code&gt; los recorrerán, por lo que la salida en consola será idéntica en las dos vueltas.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;Process([1, 2, 3]);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;Processing 3 numbers 
First pass
  Doing something with 1
  Doing something with 2
  Doing something with 3
Second pass
  Doing another thing with 1
  Doing another thing with 2
  Doing another thing with 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sin embargo, imaginad que lo que enviamos es una consulta LINQ que se ejecuta contra una base de datos. En ese caso, la llamada a &lt;code&gt;Count()&lt;/code&gt; ejecutará la consulta para obtener el número de elementos. Tras ello, el primer &lt;code&gt;foreach&lt;/code&gt; ejecutará de nuevo la consulta y obtendrá los resultados, y el segundo &lt;code&gt;foreach&lt;/code&gt; volverá a ejecutarla. Esto, &lt;b&gt;además de suponer potencialmente un problema de rendimiento, puede devolver en cada caso un conjunto diferente de resultados&lt;/b&gt; o incluso lanzar una excepción si la conexión a la base de datos ya no está disponible.&lt;/p&gt;
&lt;p&gt;Lo mismo puede ocurrir si la secuencia es generada por un iterador que produce valores bajo demanda, como en el siguiente ejemplo. Como podéis ver, se trata de una función generadora que devuelve entre 3 y 7 números aleatorios en el rango 1-9 cada vez que se itera sobre ella:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static IEnumerable&amp;lt;int&amp;gt; GenerateNumbers()
{
    for (int i = 0; i &amp;lt; Random.Shared.Next(3, 8); i++)
    {
        yield return Random.Shared.Next(1, 10);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En este caso, cada llamada a &lt;code&gt;GenerateNumbers()&lt;/code&gt; produce una secuencia diferente de números. Por lo tanto, si pasamos esta función generadora a nuestro método &lt;code&gt;Process()&lt;/code&gt;, veremos que cada vez que enumeramos la secuencia obtenemos resultados distintos, tanto en el número de elementos como en los propios valores:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;Process(GenerateNumbers());
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;Processing 2 numbers
First pass
  Doing something with 9
  Doing something with 8
  Doing something with 2
  Doing something with 3
  Doing something with 4
  Doing something with 9
  Doing something with 8
Second pass
  Doing another thing with 5
  Doing another thing with 3
  Doing another thing with 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Observad que, en este caso, cada enumeración de la secuencia ha producido un conjunto diferente de números, lo que puede llevar a comportamientos inesperados en nuestro código, como el que vemos en la salida anterior.&lt;/p&gt;
&lt;p&gt;Por tanto, cuando escribimos un método o función que acepta parámetros de tipo &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;, debemos ser conscientes de que &lt;strong&gt;estamos abriendo la puerta a que un consumidor realice invocaciones enviando secuencias no replicables&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;¿Qué son las secuencias infinitas?&lt;/h2&gt;
&lt;p&gt;Otra situación problemática es cuando la secuencia recibida es infinita. Esto puede ocurrir, por ejemplo, si la secuencia es generada por un iterador que produce valores de forma indefinida, como la siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static IEnumerable&amp;lt;int&amp;gt; InfiniteNumbers()
{
    int i = 0;
    while (true)
    {
        yield return (i++) % 10;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta secuencia generará números indefinidamente, repitiendo los dígitos del 0 al 9, por lo que &lt;b&gt;cualquier intento de recorrerla por completo derivará en un bucle infinito&lt;/b&gt;. De hecho, si pasamos esta secuencia a nuestro método &lt;code&gt;Process()&lt;/code&gt;, la llamada a &lt;code&gt;Count()&lt;/code&gt; intentará contar todos los elementos y dará lugar a un bloqueo de la aplicación.&lt;/p&gt;
&lt;h2&gt;¿Qué podemos hacer para evitar estos problemas?&lt;/h2&gt;
&lt;p&gt;Afortunadamente, hay soluciones sencillas para evitar los comportamientos inesperados cuando trabajamos con parámetros de tipo &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La opción más recomendable sería intentar &lt;strong&gt;refactorizar el método para que no sea necesario realizar más de una enumeración de la secuencia recibida&lt;/strong&gt;. En el caso anterior es complicado porque el &lt;code&gt;Count()&lt;/code&gt; inicial ya implica una enumeración, pero quizás funcionalmente podría ser prescindible o sustituible por otro enfoque similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static void Process(IEnumerable&amp;lt;int&amp;gt; numbers)
{
    var count = 0;
    foreach (var number in numbers)
    {
        count++;
        Console.WriteLine($&quot;  Doing something with {number}&quot;);
        DoSomething(number);
        Console.WriteLine($&quot;  Doing another thing with {number}&quot;);
        DoAnotherThing(number);
    }
    Console.WriteLine($&quot;{count} numbers processed&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sin duda esta es la mejor opción porque &lt;strong&gt;evita todos los problemas de raíz, sin sacrificar rendimiento ni la flexibilidad de recibir un objeto de tipo &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/strong&gt;. Además, permitiría detener la enumeración en cualquier momento, cuando ya no sea necesario procesar más elementos, sin necesidad de recorrer la secuencia completa.&lt;/p&gt;
&lt;p&gt;Sin embargo, no siempre será posible.&lt;/p&gt;
&lt;p&gt;Otra opción es bajar el nivel de abstracción y &lt;b&gt;cambiar el tipo de datos del parámetro&lt;/b&gt;, para asegurar que solo se puedan enviar colecciones que ya estén materializadas en memoria y que, por tanto, sean replicables. Por ejemplo, podríamos cambiar la firma del método para recibir objetos &lt;code&gt;IReadOnlyCollection&amp;lt;T&amp;gt;&lt;/code&gt; o &lt;code&gt;IReadOnlyList&amp;lt;T&amp;gt;&lt;/code&gt;, lo que garantiza que la colección es fija y puede ser recorrida múltiples veces sin problemas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La diferencia principal entre &lt;code&gt;IReadOnlyCollection&amp;lt;T&amp;gt;&lt;/code&gt; e &lt;code&gt;IReadOnlyList&amp;lt;T&amp;gt;&lt;/code&gt; es que la primera solo garantiza que la colección tiene un tamaño definido y puede ser contada, mientras que la segunda también permite acceder a los elementos por índice. En este caso, cualquiera de las dos opciones sería válida.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static void Process(IReadOnlyCollection&amp;lt;int&amp;gt; numbers)
{
    ... // El resto del código permanece igual
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A veces, esto &lt;strong&gt;requerirá que los consumidores del método tengan que adaptar su código para enviar colecciones materializadas&lt;/strong&gt;, pero a cambio evitamos cualquier riesgo de múltiples enumeraciones inesperadas. También estaremos protegiéndonos contra secuencias infinitas, ya que ningún consumidor podrá enviar una secuencia que no tenga un tamaño definido.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Código del consumidor
var items = GenerateNumbers().ToList(); // Materializamos la secuencia
Process(items);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si ninguna de las opciones anteriores es viable, siempre podemos optar por &lt;strong&gt;materializar la secuencia recibida al inicio del método&lt;/strong&gt;, almacenándola en una lista o &lt;em&gt;array&lt;/em&gt;. De esta forma, nos aseguramos de que cualquier enumeración posterior se realice sobre una colección fija y replicable.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;static void Process(IEnumerable&amp;lt;int&amp;gt; numbers)
{
    var materializedNumbers = numbers.ToList(); // Materializamos la secuencia
    ... // El resto del código permanece igual, pero usando materializedNumbers
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El inconveniente de esto es que, si la secuencia original es muy grande, podríamos estar consumiendo una &lt;strong&gt;cantidad significativa de memoria&lt;/strong&gt;. Tampoco tendremos protección contra secuencias infinitas, ya que la llamada a &lt;code&gt;ToList()&lt;/code&gt; intentará recorrer toda la secuencia para materializarla.&lt;/p&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;En resumen, cuando trabajamos con parámetros de tipo &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;, debemos ser conscientes de los posibles problemas que pueden surgir debido a múltiples enumeraciones o secuencias infinitas. Adoptar buenas prácticas y elegir la estrategia adecuada según el contexto nos ayudará a evitar errores y a escribir código más robusto y predecible.&lt;/p&gt;


Publicado en: &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;www.variablenotfound.com&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7618447111229845268/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7618447111229845268' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7618447111229845268'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7618447111229845268'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/ojo-los-parametros-ienumerable.html' title='¡Ojo a los parámetros IEnumerable&amp;lt;T&amp;gt;!'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJRZ3O-Y9cRmpojpLFxFWZpfGynNAF57QZgQMISplKPOVMO0d-8pelxjz4PaL62CP8DhkvtQiM9hVYihK5NsFIt-zDUdjYch2EKXsK2JrYUYqZfUzcE3TyhCzhpSXtkgrIAJXeYMb8XXadsxQpuZWSrwM5URzJgD4oWtxLkf3XWdhvz9SQ5g8fgg/s72-c/ienumerable.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7964099262990766247</id><published>2026-03-16T08:02:00.030+01:00</published><updated>2026-03-16T08:02:00.116+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 641</title><content type='html'>&lt;img alt=&quot;Semáforo en avenidas muy concurridas&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIotZwm2Fx6-ec93jArYo_Zz-cKyi-rdk_civ2knS9mI3PBHs5JRD2zg_mJDskE9j7ySWe0dAgP3eW_e4BL1-NrJHL3s6DsteLN6qA-HJn_33NnMqNRRfbqzhvuBL7ZIjQYVM5YuITro22-tsqkNkAoRmNhqaTb7b2ZuBPSWjE0KHj38peMRz08w/s800/sync.jpg&quot; width=&quot;100%&quot; /&gt;


&lt;p&gt;Esta semana me he topado con bastantes contenidos interesantes 😊&lt;/p&gt;
&lt;p&gt;Por citar algunos, ya tenemos aquí la &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-2/&quot; target=&quot;_blank&quot;&gt;segunda preview de .NET 11&lt;/a&gt;, con novedades interesantes como el &lt;em&gt;runtime&lt;/em&gt; asíncrono, soporte nativo para trazas alineadas con OpenTelemetry, mejorillas en Blazor, soporte para OpenAPI 3.2.0, nuevas plantillas de proyecto, mejoras en rendimiento y más. Si quieres conocer todos los detalles, no te pierdas el anuncio oficial.&lt;/p&gt;
&lt;p&gt;Bipin Joshi nos habla de las &lt;a href=&quot;https://www.binaryintellect.net/articles/bb02912b-6f50-4b6a-a91d-38a559064f42.aspx&quot; target=&quot;_blank&quot;&gt;Minimal APIs una vez pasó el hype inicial&lt;/a&gt;: qué nos aportan, las ventajas e inconvenientes de su ausencia de código ceremonial y sus escenarios de uso ideales.&lt;/p&gt;
&lt;p&gt;Gurveer Arora continúa exprimiendo el potencial de HTML y CSS con su serie NoJS, y en esta ocasión nos trae un &lt;a href=&quot;https://blog.scottlogic.com/2026/03/09/noJS-3-flappy-bird.html&quot; target=&quot;_blank&quot;&gt;clon de Flappy Bird hecho sin una sola línea de JavaScript&lt;/a&gt;. Porque poderse, se puede.&lt;/p&gt;
&lt;p&gt;También me ha parecido interesante la lectura de &lt;a href=&quot;https://component-model.bytecodealliance.org/&quot; target=&quot;_blank&quot;&gt;The WebAssembly Component Model&lt;/a&gt;, una arquitectura para la construcción de librerías y aplicaciones interoperables utilizando WebAssembly.&lt;/p&gt;
&lt;p&gt;Y Ricardo Peres continúa explorando las &lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/03/net-synchronisation-apis-part-2-out-of.html&quot; target=&quot;_blank&quot;&gt;APIs de sincronización en .NET&lt;/a&gt;, y en esta ocasión nos habla de las herramientas que tenemos a nuestra disposición para sincronizar distintos procesos, como &lt;code&gt;Mutex&lt;/code&gt;, &lt;code&gt;Semaphore&lt;/code&gt; y &lt;code&gt;EventWaitHandle&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El resto de enlaces, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/02/cuidado-con-las-excepciones-no.html&quot;&gt;¡Cuidado con las excepciones no controladas de servicios en segundo plano (BackgroundService) en ASP.NET Core!&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/04/antipatrones-de-asincronia-en-c.html&quot;&gt;Antipatrones de asincronía en C#&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-2/&quot;&gt;.NET 11 Preview 2 is now available!&lt;/a&gt;&lt;br /&gt;
.NET Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/splitting-the-netescapades-enumgenerators-packages-the-road-to-a-stable-release/&quot;&gt;Splitting the NetEscapades.EnumGenerators packages: the road to a stable release&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/5a750fbf-cbf1-44dc-b864-70bedd8a29a9&quot;&gt;FullJoin in .NET 11&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/03/net-synchronisation-apis-part-2-out-of.html&quot;&gt;.NET Synchronisation APIs - Part 2 - Out-of-Process Synchronisation&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/minimal-apis-fix-missing-openapi-response-documentation&quot;&gt;Minimal APIs: Fix missing OpenAPI response documentation&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/create-fillable-pdf-forms-in-dotnet-pdf-library&quot;&gt;How to Create Fillable PDF Forms in C# for Server-Side .NET Apps&lt;/a&gt;&lt;br /&gt;
Arun Kumar Chandrakesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/development/dotnet-development/how-to-use-refresh-tokens-in-asp-net-core-a-complete-guide/&quot;&gt;How to use refresh tokens in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Joydip Kanjilal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://auth0.com/blog/secure-csharp-mcp-server-with-auth0/&quot;&gt;Secure a C# MCP Server with Auth0&lt;/a&gt;&lt;br /&gt;
Andrea Chiarelli&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.binaryintellect.net/articles/bb02912b-6f50-4b6a-a91d-38a559064f42.aspx&quot;&gt;Minimal APIs After the Hype: What Remains When Boilerplate Is Gone?&lt;/a&gt;&lt;br /&gt;
Bipin Joshi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/03/09/invite-guest-users-in-a-entra-id-multi-tenant-setup/&quot;&gt;Invite Guest users in a Entra ID Multi-tenant&amp;nbsp;setup&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://markheath.net/post/2026/2/9/azure-blob-storage-etag-concurrency&quot;&gt;Protecting Against Concurrent Updates in Azure Blob Storage with ETags&lt;/a&gt;&lt;br /&gt;
Mark Heath&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/querying-and-performing-transactions-across-multiple-database-schemas-in-a-modular-monolith&quot;&gt;Querying and Performing Transactions Across Multiple Database Schemas in a Modular Monolith&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/data-retention-azure-storage-lifecycle/&quot;&gt;Nobody Runs Your Cleanup Script (And Regulators Know It)&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://irina.codes/async-does-not-mean-scalable/&quot;&gt;Async Does Not Mean Scalable&lt;/a&gt;&lt;br /&gt;
Irina Scurtu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/error-handling-security-information-disclosure/&quot;&gt;Your Stack Traces Are Love Letters to Attackers&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/5-architecture-tests-you-should-add-to-your-dotnet-projects&quot;&gt;5 Architecture Tests You Should Add to Your .NET Projects&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/vertical-slices-doesnt-mean-share-nothing/&quot;&gt;Vertical Slices doesn’t mean “Share Nothing”&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/isaacojeda/ef-core-tu-query-funciona-tus-pruebas-pasan-y-estas-leyendo-50000-filas-para-devolver-3-1c9e&quot;&gt;EF Core: tu query funciona, tus pruebas pasan… y estás leyendo 50,000 filas para devolver 3&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11633/optimize-sql-server-tempdb/&quot;&gt;SQL Server TempDB: What it is and how it works&lt;/a&gt;&lt;br /&gt;
M. A. A. Mehedi Hasan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/databases/sql-server/identity-vs-sequence-in-sql-server-which-should-you-use/&quot;&gt;IDENTITY vs SEQUENCE in SQL Server - which should you use?&lt;/a&gt;&lt;br /&gt;
Greg Low&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11634/sql-string-functions-for-data-transformation/&quot;&gt;SQL String Functions for Data Transformation&lt;/a&gt;&lt;br /&gt;
Muhammad Hassan Arshad&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://erikej.github.io/sqlserver/localdb/2026/03/13/localdb-sqlserver-2025.html&quot;&gt;Fixing SQL Server 2025 LocalDB in Visual Studio 2026: Enabling REGEXP and VECTOR Support&lt;/a&gt;&lt;br /&gt;
Erik Ejlskov Jensen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/el-nuevo-paradigma-de-la-ingenier%C3%ADa-software-juan-irigoyen-tk9ie/&quot;&gt;El nuevo paradigma de la Ingeniería de Software con IA&lt;/a&gt;&lt;br /&gt;
Juan Irigoyen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://composio.dev/blog/mcp-vulnerabilities-every-developer-should-know&quot;&gt;MCP Vulnerabilities Every Developer Should Know&lt;/a&gt;&lt;br /&gt;
Composio&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/build-a-real-world-example-with-microsoft-agent-framework-microsoft-foundry-mcp-and-aspire&quot;&gt;Build a real-world example with Microsoft Agent Framework, Microsoft Foundry, MCP and Aspire&lt;/a&gt;&lt;br /&gt;
Justin Yoo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/03/11/quadratic-regression-with-sgd-training-using-javascript.aspx&quot;&gt;Quadratic Regression with SGD Training Using JavaScript&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bloomberg.github.io/js-blog/post/standardizing-source-maps/&quot;&gt;Source Maps: Shipping Features Through Standards&lt;/a&gt;&lt;br /&gt;
Jon Kuperman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/abusing-customizable-selects/&quot;&gt;Abusing Customizable Selects&lt;/a&gt;&lt;br /&gt;
Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bloomberg.github.io/js-blog/post/temporal/&quot;&gt;Temporal: The 9-Year Journey to Fix Time in JavaScript&lt;/a&gt;&lt;br /&gt;
Jason Williams&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-value-of-z-index/&quot;&gt;The Value of z-index&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/form-associated-custom-elements-in-practice/&quot;&gt;Form-Associated Custom Elements in Practice&lt;/a&gt;&lt;br /&gt;
Rob Levin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-enforced-accessibility-of-the-geolocation-element/&quot;&gt;The Enforced Accessibility of the Geolocation Element&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://component-model.bytecodealliance.org/&quot;&gt;The WebAssembly Component Model&lt;/a&gt;&lt;br /&gt;
Bytecode Alliance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/03/beyond-border-radius-css-corner-shape-property-ui/&quot;&gt;Beyond border-radius: What The CSS corner-shape Property Unlocks For Everyday UI&lt;/a&gt;&lt;br /&gt;
Brecht De Ruyte&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vite.dev/blog/announcing-vite8&quot;&gt;Vite 8.0 is out! ​&lt;/a&gt;&lt;br /&gt;
Vite Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/03/moving-from-moment-to-temporal-api/&quot;&gt;Moving From Moment.js To The JS Temporal API&lt;/a&gt;&lt;br /&gt;
Joe Attardi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/scoped-registries?hl=en&quot;&gt;Make custom elements behave with scoped registries&lt;/a&gt;&lt;br /&gt;
Jayson Chen &amp;amp; Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patrickbrosset.com/articles/2026-03-09-using-css-animations-as-state-machines-to-remember-focus-and-hover-states-with-css-only/&quot;&gt;Using CSS animations as state machines to remember focus and hover states with CSS only&lt;/a&gt;&lt;br /&gt;
Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.scottlogic.com/2026/03/09/noJS-3-flappy-bird.html&quot;&gt;NoJS 3 - The dawn of Flappy Bird. Making a Flappy Bird clone using pure HTML and CSS, no JavaScript&lt;/a&gt;&lt;br /&gt;
Gurveer Arora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bocoup.com/blog/the-webs-most-tolerated-feature&quot;&gt;The Web’s Most Tolerated Feature&lt;/a&gt;&lt;br /&gt;
Mike Pennisi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/kubernetes-controlador-de-nodos-node-readiness-controller.aspx&quot;&gt;Kubernetes soluciona el caos de la programación de pods con su nuevo controlador de nodos&lt;/a&gt;&lt;br /&gt;
CampusMVP&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/03/mi-configuracion-de-dev-container-para-desarrollar-plugins-de-wordpress/&quot;&gt;Mi configuración de Dev Container para desarrollar plugins de WordPress&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/extend-your-coding-agent-with-dotnet-skills/&quot;&gt;Extend your coding agent with .NET Skills&lt;/a&gt;&lt;br /&gt;
Tim Heuer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/modernize-dotnet-anywhere-with-ghcp/&quot;&gt;Modernize .NET Anywhere with GitHub Copilot&lt;/a&gt;&lt;br /&gt;
Mika Dumont&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.uno/blog/configuring-claude-code-for-real-net-projects/&quot;&gt;Configuring Claude Code for Real .NET Projects&lt;/a&gt;&lt;br /&gt;
Matt Mattei&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/profile-picture-editor-maui&quot;&gt;Build a Profile Picture Editor in .NET MAUI with the Image Editor&lt;/a&gt;&lt;br /&gt;
Karthick Mani&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/5-ux-tips-net-maui-developers&quot;&gt;5 UX Tips for .NET MAUI Developers&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7964099262990766247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7964099262990766247' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7964099262990766247'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7964099262990766247'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/enlaces-interesantes-641.html' title='Enlaces interesantes 641'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIotZwm2Fx6-ec93jArYo_Zz-cKyi-rdk_civ2knS9mI3PBHs5JRD2zg_mJDskE9j7ySWe0dAgP3eW_e4BL1-NrJHL3s6DsteLN6qA-HJn_33NnMqNRRfbqzhvuBL7ZIjQYVM5YuITro22-tsqkNkAoRmNhqaTb7b2ZuBPSWjE0KHj38peMRz08w/s72-c/sync.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-4042273022300497592</id><published>2026-03-09T08:05:00.027+01:00</published><updated>2026-03-09T08:05:00.116+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 640</title><content type='html'>&lt;img alt=&quot;Desarrollador haciendo ejercicio mientras trabaja&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJtbBrLgpP7EVAh-0mfablzmXSOBejWqVZF-oMO6qDBQV5kayceWa73oWLtDmsP4188EzTAjkdsVz38LZ-brYEmo071_MdZ5vMWlEyB7OQ38C9rtkFXQfb1V3JHJWa9csKzp_JsSyHFubp_m6wkKOctPW4LGDr1Z3f6QYd3gH8kFOyDn2hWuBxIA/s800/mens-sana.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Ya he publicado los enlaces a contenidos interesantes que he ido descubriendo a lo largo de la semana pasada 😊&lt;/p&gt;
&lt;p&gt;En esta entrega, destacamos el repaso de Martin Stühmer a los &lt;a href=&quot;https://daily-devops.net/posts/session-management-aspnet-authentication/&quot; target=&quot;_blank&quot;&gt;errores más comunes en la gestión de sesiones en aplicaciones ASP.NET Core&lt;/a&gt; y cómo evitarlos para mejorar su seguridad de nuestras aplicaciones.&lt;/p&gt;
&lt;p&gt;Se ha lanzado la versión 1.0 del &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/release-v10-of-the-official-mcp-csharp-sdk/&quot; target=&quot;_blank&quot;&gt;SDK oficial de MCP para C#&lt;/a&gt;. Aún no he tenido tiempo de probarlo, pero así al vistazo parece que puede facilitarnos un poco la vida a la hora de integrar nuestras aplicaciones con modelos de lenguaje y otros servicios de IA.&lt;/p&gt;
&lt;p&gt;Y seguimos con más lanzamientos, Jetbrains han anunciado &lt;a href=&quot;https://blog.jetbrains.com/dotnet/2026/03/05/resharper-for-visual-studio-code-cursor-and-compatible-editors-is-out/&quot; target=&quot;_blank&quot;&gt;ReSharper para Visual Studio Code, Cursor y editores compatibles&lt;/a&gt;. Como fan incondicional de esta herramienta desde hace años, me alegra que ahora esté también disponible más allá de Visual Studio.&lt;/p&gt;
&lt;p&gt;Por último, Gerson Azabache nos recuerda &lt;a href=&quot;https://bravedeveloper.com/2026/02/22/quieres-programar-mejor-empieza-por-entrenar-tu-cuerpo/&quot; target=&quot;_blank&quot;&gt;la importancia de hacer ejercicio&lt;/a&gt;, especialmente para los desarrolladores, que pasamos muchas horas sentados frente al ordenador y a menudo descuidamos nuestra salud física.&lt;/p&gt;
&lt;p&gt;Muchos más enlaces a contenidos interesantes, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/01/gestion-centralizada-de-paquetes-nuget.html&quot;&gt;Gestión centralizada de paquetes NuGet en soluciones y proyectos .NET&lt;/a&gt;&lt;br /&gt;José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/03/si-las-shadow-properties-no-existen.html&quot;&gt;Si las shadow properties no existen como propiedades en la entidad, ¿cómo podemos inicializarlas en el seed de Entity Framework Core?&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/why-ienumerable-can-kill-performance-in-hot-paths/&quot;&gt;Why IEnumerable Can Kill Performance in Hot Paths&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/creating-case-sensitive-folders-on-windows-using-csharp.htm&quot;&gt;Creating case-sensitive folders on Windows using C#&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://minidump.net/writing-a-net-gc-in-c-part-8/&quot;&gt;Writing a .NET Garbage Collector in C#&lt;/a&gt;&lt;br /&gt;
Kevin Gosse&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/yarp-as-api-gateway-in-dotnet&quot;&gt;YARP as API Gateway in .NET: 7 Real-World Scenarios You Should Know&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/03/aspnet-core-tryparse-error-when-using.html&quot;&gt;TryParse error when using Minimal APIs&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/how-to-secure-asp-net-core-apis-basic-authentication&quot;&gt;How to secure ASP.NET Core APIs with Basic Authentication&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elguerre.com/2026/03/03/stop-re-entering-your-token-in-swagger-ui-enablepersistauthorization-in-asp-net-core/&quot;&gt;Stop Re-Entering Your Token in Swagger UI: EnablePersistAuthorization in ASP.NET&amp;nbsp;Core&lt;/a&gt;&lt;br /&gt;
Juan Luis Guerrero&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260303-rate-limiting-identityserver-endpoints&quot;&gt;Rate Limiting IdentityServer Endpoints&lt;/a&gt;&lt;br /&gt;
Maarten Balliauw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/03/cleaner-minimal-api-endpoints-with.html&quot;&gt;Cleaner Minimal API Endpoints with [AsParameters]&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/customizing-new-reconnectmodal-component-blazor-10&quot;&gt;Customizing the New ReconnectModal Component in Blazor 10&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/session-management-aspnet-authentication/&quot;&gt;Your Logout Button Is Lying: ASP.NET Session Security Done Right&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/Mar/02/Azure-Trusted-Signing-Revisited-with-Dotnet-Sign&quot;&gt;Azure Trusted Signing Revisited with Dotnet Sign&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/introducing-gpt-5-4-in-microsoft-foundry/4499785&quot;&gt;Introducing GPT-5.4 in Microsoft Foundry&lt;/a&gt;&lt;br /&gt;
Naomi Moneypenny&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/03/01/when-to-use-factory-method-pattern-in-c-decision-guide-with-examples&quot;&gt;When to Use Factory Method Pattern in C#: Decision Guide with Examples&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.devleader.ca/2026/03/03/prototype-design-pattern-in-c-complete-guide-with-examples&quot;&gt;Prototype Design Pattern in C#: Complete Guide with Examples&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/fencing-tokens-and-generation-clock-in-net-stop-zombie-leaders-from-writing/&quot;&gt;Fencing Tokens and Generation Clock in .NET: Stop Zombie Leaders From Writing&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://consultwithgriff.com/dapper-nvarchar-implicit-conversion-performance-trap/&quot;&gt;How C# Strings Silently Kill Your SQL Server Indexes in Dapper&lt;/a&gt;&lt;br /&gt;
Kevin W. Griffin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/03/managing-multiple-sql-server-instances.html&quot;&gt;Managing multiple SQL Server instances from SQL Server Management Studio&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/es-ES/index/gpt-5-3-instant/&quot;&gt;GPT-5.3 Instant: conversaciones cotidianas más fluidas y útiles&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://openai.com/index/introducing-gpt-5-4/&quot;&gt;Introducing GPT-5.4&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mlu-explain.github.io/decision-tree/&quot;&gt;Decision Trees&lt;/a&gt;&lt;br /&gt;
Jared Wilber &amp;amp; Lucía Santamaría&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matthias-kainer.de/blog/posts/so-whats-the-next-word-then-/&quot;&gt;So whats the next word, then?&lt;/a&gt;&lt;br /&gt;
Matthias Kainer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/semantic-kernel/give-your-agents-domain-expertise-with-agent-skills-in-microsoft-agent-framework/&quot;&gt;Give Your Agents Domain Expertise with Agent Skills in Microsoft Agent Framework&lt;/a&gt;&lt;br /&gt;
Sergey Menshykh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/release-v10-of-the-official-mcp-csharp-sdk/&quot;&gt;Release v1.0 of the official MCP C# SDK&lt;/a&gt;&lt;br /&gt;
Mike Kistler&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/model-context-protocol-csharp-sdk&quot;&gt;Model Context Protocol (MCP): Building AI Integrations in .NET Using the C# SDK&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MicrosoftDocs/Agent-Skills&quot;&gt;MicrosoftDocs/Agent-Skills: Curated Agent Skills for Microsoft &amp;amp; Azure – giving AI coding assistants structured, real-time expertise from Microsoft Learn docs&lt;/a&gt;&lt;br /&gt;
Microsoft&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.enmilocalfunciona.io/tanstack-query-viste-la-camisa-de-angular/&quot;&gt;TanStack Query en Angular: caché y rendimiento&lt;/a&gt;&lt;br /&gt;
David Filipe Lopes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-rc/&quot;&gt;Announcing TypeScript 6.0 RC&lt;/a&gt;&lt;br&gt;
Daniel Rosenwasser&lt;/li&gt;  
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/popover-api-or-dialog-api-which-to-choose/&quot;&gt;Popover API or Dialog API: Which to Choose?&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/baseline-navigation-api&quot;&gt;Navigation API - a better way to navigate, is now Baseline Newly Available&lt;/a&gt;&lt;br /&gt;
Ray Rungta&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-odometer-effect-in-css/&quot;&gt;The Odometer Effect (without JavaScript)&lt;/a&gt;&lt;br /&gt;
Preethi Sam&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/web-platform-02-2026?hl=en&quot;&gt;New to the web platform in February&lt;/a&gt;&lt;br /&gt;
Rachel Andrew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://christianheilmann.com/2026/02/28/quick-tip-hosting-html-css-js-demos-from-source-code-on-github-pages/&quot;&gt;Quick tip: hosting HTML/CSS/JS demos from source code on GitHub Pages&lt;/a&gt;&lt;br /&gt;
Christian Heilmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lemire.me/blog/2026/02/28/you-can-use-newline-characters-in-urls/&quot;&gt;You can use newline characters in URLs&lt;/a&gt;&lt;br /&gt;
Daniel Lemire&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.angular.dev/security-advisory-addressing-recent-vulnerabilities-in-angular-c2656249b799&quot;&gt;Security Advisory: Addressing Recent Vulnerabilities in Angular&lt;/a&gt;&lt;br /&gt;
Angular Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tympanus.net/codrops/2026/03/02/sticky-grid-scroll-building-a-scroll-driven-animated-grid/&quot;&gt;Sticky Grid Scroll: Building a Scroll-Driven Animated Grid&lt;/a&gt;&lt;br /&gt;
Theo Plawinski&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/singleton-not-understanding-angular-services-right-way&quot;&gt;Singleton or Not? Understanding Angular Services&lt;/a&gt;&lt;br /&gt;
Dhananjay Kumar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-different-ways-to-select-html-in-css/&quot;&gt;The Different Ways to Select &amp;lt;html&amp;gt; in CSS&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-big-gotcha-of-anchor-positioning/&quot;&gt;The Big Gotcha of Anchor Positioning&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/ai-and-ml/github-copilot/from-idea-to-pull-request-a-practical-guide-to-building-with-github-copilot-cli/&quot;&gt;From idea to pull request: A practical guide to building with GitHub Copilot CLI&lt;/a&gt;&lt;br /&gt;
Ari LiVigni&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/03/04/%e2%8f%b0-clocktray-hide-or-show-your-windows-clock-with-one-click/&quot;&gt;ClockTray – Hide or Show Your Windows Clock with One Click (yes, in C#)&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/dotnet/2026/03/05/resharper-for-visual-studio-code-cursor-and-compatible-editors-is-out/&quot;&gt;ReSharper for Visual Studio Code, Cursor, and Compatible Editors Is Out&lt;/a&gt;&lt;br /&gt;
Sasha Ivanova &amp;amp; Alexander Kurakin&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/stream-live-data-maui-datagrid-firebase&quot;&gt;How to Stream Real-Time Data into a .NET MAUI DataGrid Using Firebase&lt;/a&gt;&lt;br /&gt;
Shalini Suresh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/net-10-secondary-toolbar-items-ios-macos-net-maui&quot;&gt;.NET 10: Secondary Toolbar Items for iOS, macOS in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/02/22/quieres-programar-mejor-empieza-por-entrenar-tu-cuerpo/&quot;&gt;¿Quieres programar mejor? Empieza por entrenar tu cuerpo&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewkchan.dev/posts/crawler.html&quot;&gt;Crawling a billion web pages in just over 24 hours&lt;/a&gt;&lt;br /&gt;
Andrew Chan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/4042273022300497592/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/4042273022300497592' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4042273022300497592'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4042273022300497592'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/enlaces-interesantes-640.html' title='Enlaces interesantes 640'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJtbBrLgpP7EVAh-0mfablzmXSOBejWqVZF-oMO6qDBQV5kayceWa73oWLtDmsP4188EzTAjkdsVz38LZ-brYEmo071_MdZ5vMWlEyB7OQ38C9rtkFXQfb1V3JHJWa9csKzp_JsSyHFubp_m6wkKOctPW4LGDr1Z3f6QYd3gH8kFOyDn2hWuBxIA/s72-c/mens-sana.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-4637831056624096227</id><published>2026-03-03T08:05:00.006+01:00</published><updated>2026-03-06T16:38:24.293+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#bizarro"/><title type='text'>C# bizarro, episodio 7: crisis de identidad</title><content type='html'>&lt;img alt=&quot;Dos personas conectadas a una máquina para cambiar su identidad&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVDZ8FUPBTQwyR0jPkZrFJgh3ihOx3qLq_Ync1GhkaBjWRzNatN_xjhuOLjEg4ts71wi2j4N_-GLkrzc-DzEvSCpyVKFQAdRMU32u9ntxV3GU_OFAIR1foAiZ4WY7_8m2otZ8qvdkzpCYWDc6qQIMZsymXfqurhpw8pbb4ic5dSigWZ4YQT8XVRg/s1024/identity-crisis.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Vamos con una entrega más (siete llevamos ya) de la serie &lt;a href=&quot;https://www.variablenotfound.com/search/label/c%23bizarro&quot;&gt;C# bizarro&lt;/a&gt;, estos divertidos posts donde ponemos a prueba nuestros conocimientos del lenguaje mientras exploramos algunas de sus características extrañas o poco conocidas.&lt;/p&gt;
&lt;p&gt;En esta ocasión, os propongo que le echéis un vistazo al siguiente código, en especial a su método &lt;code&gt;ChangeIdentity()&lt;/code&gt;, que pretende cambiar la identidad de una persona por la de otra que le llega como parámetro:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var john = new Person() { Name = &quot;John&quot; };
var peter = new Person() { Name = &quot;Peter&quot; };

john.ChangeIdentity(peter);
Console.WriteLine(john.Equals(peter));

struct Person
{
    public string Name;

    public void ChangeIdentity(Person otherPerson)
    {
        this = otherPerson; // WFT!?!?
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En efecto, en el cuerpo del método &lt;strong&gt;estamos asignando un nuevo valor a &lt;code&gt;this&lt;/code&gt;&lt;/strong&gt;. ¿Pensáis que esto compilará? Y en caso afirmativo, ¿qué veríamos en la consola al ejecutarlo, &lt;code&gt;true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt;?&lt;/p&gt;
&lt;details&gt;
&lt;summary style=&quot;cursor: pointer; margin-bottom: 10px;&quot;&gt;Deteneos un poco en el código y pensad en la respuesta, que, aunque tiene algo de truco, seguro que podéis encontrarla porque no es muy retorcida. Pero si se resiste o no lo tenéis claro, siempre podréis &lt;b style=&quot;text-decoration: underline;&quot;&gt;pulsar aquí para leer la solución&lt;/b&gt; 👇👇&lt;/summary&gt;
&lt;p&gt;El código, efectivamente, &lt;strong&gt;compila sin problema&lt;/strong&gt;. Aunque la asignación de &lt;code&gt;this&lt;/code&gt; pueda parecer extraña, es perfectamente válida en C# porque estamos &lt;strong&gt;en el interior del método de instancia de una estructura&lt;/strong&gt;. No compilaría, en cambio, si &lt;code&gt;Person&lt;/code&gt; fuera una clase.&lt;/p&gt;
&lt;p&gt;Esto se debe a que internamente &lt;strong&gt;las estructuras son tipos valor&lt;/strong&gt;, por lo que &lt;code&gt;this&lt;/code&gt; representa una copia completa del valor de la estructura en memoria. Al asignar &lt;code&gt;this = otherPerson&lt;/code&gt;, estamos copiando el valor de &lt;code&gt;otherPerson&lt;/code&gt;&amp;nbsp;sobre&amp;nbsp;&lt;code&gt;this&lt;/code&gt;, lo que en la práctica significa que estamos copiando el valor de todos los campos de la estructura origen&amp;nbsp;sobre la actual, aunque sin tener que hacerlo de forma manual 🙂&lt;/p&gt;
&lt;p&gt;En clases, sin embargo, &lt;code&gt;this&lt;/code&gt; es una referencia (o puntero) inmutable a la instancia del objeto en memoria, por lo que no se puede reasignar para ponerla apuntando a otro objeto.&lt;/p&gt;
&lt;p&gt;Ahora vamos con la segunda parte de la pregunta, ¿qué veremos en la consola al ejecutar el código que utiliza el método &lt;code&gt;ChangeIdentity()&lt;/code&gt;?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var john = new Person() { Name = &quot;John&quot; };
var peter = new Person() { Name = &quot;Peter&quot; };

john.ChangeIdentity(peter);
Console.WriteLine(john.Equals(peter));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seguro que habéis adivinado que la respuesta es &lt;code&gt;true&lt;/code&gt;. Fijaos que si hubiésemos utilizado clases en lugar de estructuras, el resultado habría sido &lt;code&gt;false&lt;/code&gt;, ya que &lt;code&gt;john&lt;/code&gt; y &lt;code&gt;peter&lt;/code&gt; serían punteros a objetos distintos en memoria y la igualdad por referencia nunca sería cierta. Pero al ser estructuras, &lt;strong&gt;la comprobación de igualdad se realiza por valor&lt;/strong&gt;, es decir, comparando los valores de todos sus campos.&lt;/p&gt;
&lt;p&gt;Y dado que anteriormente hemos copiado los valores de todos los campos de &lt;code&gt;peter&lt;/code&gt; sobre la estructura &lt;code&gt;john&lt;/code&gt;, ambos objetos son idénticos en memoria y, por tanto, la operación de comparación devuelve &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Qué, ¿lo habíais adivinado? 😄&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/4637831056624096227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/4637831056624096227' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4637831056624096227'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4637831056624096227'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/c-bizarro-episodio-7-crisis-de-identidad.html' title='C# bizarro, episodio 7: crisis de identidad'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVDZ8FUPBTQwyR0jPkZrFJgh3ihOx3qLq_Ync1GhkaBjWRzNatN_xjhuOLjEg4ts71wi2j4N_-GLkrzc-DzEvSCpyVKFQAdRMU32u9ntxV3GU_OFAIR1foAiZ4WY7_8m2otZ8qvdkzpCYWDc6qQIMZsymXfqurhpw8pbb4ic5dSigWZ4YQT8XVRg/s72-c/identity-crisis.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7146324157199649666</id><published>2026-03-02T08:01:00.027+01:00</published><updated>2026-03-02T08:01:00.119+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 639</title><content type='html'>&lt;img alt=&quot;Desarrollador bastante desesperado mientras depura un código&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOWsJgt7acfWUe8IuVAkl87PGOseYwIloL1Ew62wIkcGl9nOo0Ge_GnBw_Z8xZsDe9LynYhvwwzKfHJPJghx4Yy9us_w2gGAF4I0UtrLzywR4L9dqaRYe7LWoEQ5w7gRBoRNPL9Mil2zmV16l-rXCtXEhFB7lhVGpPJmL4lbxqSQ7jXPuor-R8Sw/s800/debugging.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Una semana más, vamos con los enlaces a contenidos interesantes que he ido recopilando durante estos días, entre los que destaco algunos posts.&lt;/p&gt;
&lt;p&gt;Juan Irigoyen comparte sus &lt;a href=&quot; https://www.linkedin.com/pulse/optimizaci%C3%B3n-en-sql-server-ia-juan-irigoyen-gwo0e/&quot; target=&quot;_blank&quot;&gt;experiencias utilizando IA para optimizar SQL Server&lt;/a&gt;, en un interesante recorrido por la preparación de un agente Claude capaz de analizar y optimizar consultas SQL, con resultados bastante prometedores.&lt;/p&gt;
&lt;p&gt;La depuración puede ser una labor compleja, intensa, a veces frustrante y otras gratificante, pero sin duda forma parte de nuestro día a día. En este artículo, Jeremy D. Miller reflexiona sobre &lt;a href=&quot;https://jeremydmiller.com/2026/02/24/on-debugging-problems/&quot; target=&quot;_blank&quot;&gt;el proceso de depuración&lt;/a&gt;, compartiendo consejos para abordar los problemas de manera efectiva-&lt;/p&gt;
&lt;p&gt;Y para terminar, una frikada épica a la que llego a través de Microsiervos: &lt;a href=&quot;https://lyra.horse/x86css/&quot; target=&quot;_blank&quot;&gt;un procesador x86 completo implementado únicamente con CSS&lt;/a&gt;, sin una sola línea de código JavaScript, y que es capaz de ejecutar código ensamblador compilado para ese procesador.&lt;/p&gt;&lt;p&gt;El resto de contenidos interesantes, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2025/01/trocear-predicados-para-mejorar-la.html&quot;&gt;Trocear predicados para mejorar la legibilidad&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/03/shadow-properties-en-entity-framework.html&quot;&gt;Shadow properties en Entity Framework Core&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/02/01/logging-profesional-en-net-con-serilog-minimalismo-bien-hecho/&quot;&gt;Logging Profesional en .NET con Serilog: Minimalismo Bien Hecho&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/22/when-to-use-builder-pattern-in-c-decision-guide-with-examples&quot;&gt;When to Use Builder Pattern in C#: Decision Guide with Examples&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/smarter-way-learn-dotnet-without-reading-docs&quot;&gt;A smarter way to learn .NET without reading the docs&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/dotnet-11-preview1/&quot;&gt;.NET 11 Preview 1 Arrives with Runtime Async, Zstandard Support, and C# 15 Features&lt;/a&gt;&lt;br /&gt;
Almir Vuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/recording-metrics-in-process-using-meterlistener/&quot;&gt;Recording metrics in-process using MeterListener&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/02/cleaner-switch-expressions-with-pattern.html&quot;&gt;Cleaner switch expressions with pattern matching in C#&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/vector-data-in-dotnet-building-blocks-for-ai-part-2/&quot;&gt;Vector Data in .NET - Building Blocks for AI Part 2&lt;/a&gt;&lt;br /&gt;
Jeremy Likness&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabsoverspaces.com/233961-is-it-faster-to-index-into-an-array-or-use-switch-statement-for-lookups&quot;&gt;Is it faster to index into an array or use switch statement for lookups?&lt;/a&gt;&lt;br /&gt;
Jiří Činčura&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/25/semantic-kernel-in-c-complete-ai-orchestration-guide&quot;&gt;Semantic Kernel in C#: Complete AI Orchestration Guide&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/02/net-synchronisation-apis-part-1-in.html&quot;&gt;.NET Synchronisation APIs - Part 1&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pvs-studio.com/en/blog/posts/1348/&quot;&gt;Brave new C#&lt;/a&gt;&lt;br /&gt;
PVS-Studio&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/developing-an-mcp-server-with-c-a-complete-guide/&quot;&gt;Developing an MCP Server with C#: A Complete Guide&lt;/a&gt;&lt;br /&gt;
NDepend Team&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/consent-management-aspnet-identity/&quot;&gt;Cookie Banners Won&#39;t Save You From ISO 27701&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/stop-wrestling-with-javascript-htmxrazor-gives-asp-net-core-the-component-library-it-deserves/&quot;&gt;Stop Wrestling with JavaScript: htmxRazor Gives ASP.NET Core the Component Library It Deserves&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/appsonazureblog/how-to-troubleshoot-azure-functions-not-visible-in-azure-portal/4495873&quot;&gt;How to Troubleshoot Azure Functions Not Visible in Azure Portal&lt;/a&gt;&lt;br /&gt;
Vikas Gupta&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azuredevcommunityblog/optimising-ai-costs-with-microsoft-foundry-model-router/4494776&quot;&gt;Optimising AI Costs with Microsoft Foundry Model Router&lt;/a&gt;&lt;br /&gt;
Lee Stott&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://franiglesias.github.io/rename/&quot;&gt;Rename, para entender mejor&lt;/a&gt;&lt;br /&gt;
Fran Iglesias&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/read-replicas-are-not-cqrs-stop-confusing-this/&quot;&gt;Read Replicas Are NOT CQRS (Stop Confusing This)&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/how-to-avoid-code-duplication-in-vertical-slice-architecture-in-dotnet&quot;&gt;How to Avoid Code Duplication in Vertical Slice Architecture in .NET&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ploeh.dk/2026/02/23/tdd-as-induction/&quot;&gt;TDD as induction&lt;/a&gt;&lt;br /&gt;
Mark Seemann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jeremydmiller.com/2026/02/24/on-debugging-problems/&quot;&gt;On Debugging Problems&lt;/a&gt;&lt;br /&gt;
Jeremy D. Miller&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/optimizaci%C3%B3n-en-sql-server-ia-juan-irigoyen-gwo0e/&quot;&gt;Optimización en Sql Server usando IA&lt;/a&gt;&lt;br /&gt;
Juan Irigoyen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://erikdarling.com/emulating-getdate-on-azure-sql-database/&quot;&gt;Emulating GETDATE() on Azure SQL Database&lt;/a&gt;&lt;br /&gt;
Joe Obbish&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/polymorphic-relationships-in-ef-core-three-approaches/&quot;&gt;Polymorphic Relationships in EF Core: Three Approaches&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11614/select-top-in-sql-server/&quot;&gt;The Hidden Work Behind SELECT TOP in SQL Server&lt;/a&gt;&lt;br /&gt;
Jared Westover&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/isaacojeda/primeros-pasos-con-microsoft-agent-framework-construyendo-un-chatbot-de-soporte-con-c-46m0&quot;&gt;Primeros pasos con Microsoft Agent Framework: construyendo un chatbot de soporte con C#&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/02/23/microsoft-agent-framework-is-release-candidate-lets-go-%f0%9f%94%a5%f0%9f%a4%96/&quot;&gt;Microsoft Agent Framework is Release Candidate! Let’s Go&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dl.acm.org/doi/10.1145/3779312&quot;&gt;Redefining the Software Engineering Profession for AI&lt;/a&gt;&lt;br /&gt;
Mark Russinovich &amp;amp; Scott Hanselman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elguerre.com/2026/02/28/tip-how-to-add-mcp-servers-to-claude-code-and-gemini-cli-on-windows/&quot;&gt;[TIP] How to Add MCP Servers to Claude Code and Gemini CLI on&amp;nbsp;Windows&lt;/a&gt;&lt;br /&gt;
Juan Luis Guerrero&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://benhatsor.medium.com/playing-css-defined-animations-with-javascript-99573ef4738b&quot;&gt;Playing CSS-defined animations with JavaScript&lt;/a&gt;&lt;br /&gt;
Ben Hatsor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/loading-smarter-svg-vs-raster-loaders-in-modern-web-design/&quot;&gt;Loading Smarter: SVG vs. Raster Loaders in Modern Web Design&lt;/a&gt;&lt;br /&gt;
Mariana Beldi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/virtual-scroll-driven-3d-scenes/&quot;&gt;Virtual Scroll-Driven 3D Scenes&lt;/a&gt;&lt;br /&gt;
Gunnar Bachelor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hacks.mozilla.org/2026/02/goodbye-innerhtml-hello-sethtml-stronger-xss-protection-in-firefox-148/&quot;&gt;Goodbye innerHTML, Hello setHTML: Stronger XSS Protection in Firefox 148 - Mozilla Hacks&lt;/a&gt;&lt;br /&gt;
Tom Schuster, Frederik Braun &amp;amp; Christoph Kerschbaumer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/a-complete-guide-to-bookmarklets/&quot;&gt;A Complete Guide to Bookmarklets&lt;/a&gt;&lt;br /&gt;
Declan Chidlow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/an-exploit-in-css/&quot;&gt;An Exploit ... in CSS?!&lt;/a&gt;&lt;br /&gt;
Lee Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mescius.com/blogs/guide-to-jakobs-law-web-development&quot;&gt;A Guide to Jakob’s Law in Web Development&lt;/a&gt;&lt;br /&gt;
Adrew Peterson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/react-19-suspense-for-data-fetching&quot;&gt;React 19 Suspense for Data Fetching: A New Model for Async UI&lt;/a&gt;&lt;br /&gt;
Prashant Yadav&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/a-better-web-streams-api/&quot;&gt;We deserve a better streams API for JavaScript&lt;/a&gt;&lt;br /&gt;
James M. Snell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/yet-another-way-to-center-an-absolute-element/&quot;&gt;Yet Another Way to Center an (Absolute) Element&lt;/a&gt;&lt;br /&gt;
Juan Diego Rodríguez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tip.com/if-trick/&quot;&gt;The Hidden Trick of Style Queries and if()&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tympanus.net/codrops/2026/02/26/building-async-page-transitions-in-vanilla-javascript/&quot;&gt;Building Async Page Transitions in Vanilla JavaScript&lt;/a&gt;&lt;br /&gt;
Valentin Mor&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/02/08/curl-para-desarrolladores-net-guia-practica-real-y-profesional/&quot;&gt;cURL para desarrolladores .NET: guía práctica, real y profesional&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/changelog/2026-02-25-github-copilot-cli-is-now-generally-available/&quot;&gt;GitHub Copilot CLI is now generally available&lt;/a&gt;&lt;br /&gt;
GitHub Copilot Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/the-dongle-died-at-midnight/&quot;&gt;The Dongle Died at Midnight – WinForms Agent Saved my German Mom&#39;s Business Trip&lt;/a&gt;&lt;br /&gt;
Klaus Loeffelmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/enterprise-ui-with-mcp-servers&quot;&gt;Introducing Agentic UI Builder: Build Complete Enterprise UIs with Syncfusion MCP Servers&lt;/a&gt;&lt;br /&gt;
Lokeshwaran Ragavan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.docker.com/blog/run-openclaw-securely-in-docker-sandboxes/&quot;&gt;Run OpenClaw Securely in Docker Sandboxes&lt;/a&gt;&lt;br /&gt;
Oleg Selajev&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.xaml.io/post/xaml-io-v0-6/&quot;&gt;XAML.io v0.6: Share Running .NET Code With a Link&lt;/a&gt;&lt;br /&gt;
XAM.io Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/educatordeveloperblog/stop-drawing-architecture-diagrams-manually-meet-the-open-source-ai-architecture/4496271&quot;&gt;Stop Drawing Architecture Diagrams Manually: Meet the Open-Source AI Architecture Review Agents&lt;/a&gt;&lt;br /&gt;
Shivam Goyal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/blogs/2026/02/26/long-distance-nes&quot;&gt;VS Code: Building Long-Distance Next Edit Suggestions&lt;/a&gt;&lt;br /&gt;
Vikram Duvvur, Gaurav Mittal &amp;amp; Benjamin Simmonds&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/simplifying-grid-layout-net-maui-using-extension-methods&quot;&gt;Simplifying Grid Layout in .NET MAUI Using Extension Methods&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thewissen.io/csharp-expressions-in-net-maui-xaml/&quot;&gt;C# Expressions in XAML: throw out your converters&lt;/a&gt;&lt;br /&gt;
Steven Thewissen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/email-toast-reminders-maui-scheduler&quot;&gt;How to Add Email and Toast Reminders to a .NET MAUI Scheduler&lt;/a&gt;&lt;br /&gt;
Yuvaraj Gajaraj&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://shiftmag.dev/developers-your-ego-is-the-real-bug-in-the-system-7657/&quot;&gt;What is egoless programming?&lt;/a&gt;&lt;br /&gt;
Ivan Kranjec&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lyra.horse/x86css/&quot;&gt;x86 CPU made in CSS&lt;/a&gt;&lt;br /&gt;
Lyra Rebane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7146324157199649666/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7146324157199649666' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7146324157199649666'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7146324157199649666'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/03/enlaces-interesantes-639.html' title='Enlaces interesantes 639'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOWsJgt7acfWUe8IuVAkl87PGOseYwIloL1Ew62wIkcGl9nOo0Ge_GnBw_Z8xZsDe9LynYhvwwzKfHJPJghx4Yy9us_w2gGAF4I0UtrLzywR4L9dqaRYe7LWoEQ5w7gRBoRNPL9Mil2zmV16l-rXCtXEhFB7lhVGpPJmL4lbxqSQ7jXPuor-R8Sw/s72-c/debugging.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-8082408171120713411</id><published>2026-02-23T08:02:00.030+01:00</published><updated>2026-02-23T08:02:00.119+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 638</title><content type='html'>&lt;img alt=&quot;Desarrollador trabajando concentrado mientras alrededor pasan muchas cosas&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnBSoO56QpMdSUXvcqk0rZQG60wBf1ejaNFvWhfcUVcoQCr35QSyybDbmP_y1IDqPBIyXdfurMLDjwWojchEFmkqL_vt1YZiSzgXuWCVF_sVQwtuNopb5fRtMOfy7AmjOQabv2wxxJQBjc78akbnp1EP2LB3Qk7yG0cLP6iMaUtsjRSLk9YgP-KA/s800/flow-programming.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Otra semana de contenidos interesantes en la web 🙂&lt;/p&gt;
&lt;p&gt;Según Milan Milanović, &lt;a href=&quot;https://newsletter.techworld-with-milan.com/p/you-can-code-only-4-hours-per-day&quot; target=&quot;_blank&quot;&gt;solo 3–4 horas al día son realmente productivas al programar&lt;/a&gt;, porque el resto del tiempo se pierde por límites cognitivos, reuniones e interrupciones. Si conseguimos optimizar ese tiempo, mejorará nuestro rendimiento y la calidad del software que desarrollemos, mucho más que intentar trabajar más horas.&lt;/p&gt;
&lt;p&gt;Bruno Capuano nos &lt;a href=&quot;https://elbruno.com/2026/02/13/local-embeddings-in-net-the-easy-way/&quot; target=&quot;_blank&quot;&gt;habla sobre la generación de embeddings&lt;/a&gt;, tanto de texto como de imágenes, en nuestro equipo local, y nos presenta una biblioteca de código abierto que ha desarrollado para facilitar esta tarea en .NET.&lt;/p&gt;
&lt;p&gt;¿En qué se diferencian las colecciones Readonly de las Immutables? ¿Y qué son las colecciones Frozen? Pues aunque parezcan lo mismo, Davide Bellone nos muestra que &lt;a href=&quot;https://www.code4it.dev/blog/readonly-vs-immutable-vs-frozen/&quot; target=&quot;_blank&quot;&gt;son cosas muy diferentes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La primera preview de .NET 11 ya trae algunas novedades interesantes. Steven Giesel nos muestra que &lt;a href=&quot;https://steven-giesel.com/blogPost/1fb10ed2-df84-4080-b660-72c04a4cc674&quot; target=&quot;_blank&quot;&gt;el nuevo runtime async es una realidad&lt;/a&gt;, y que va a mejorar mucho el rendimiento de las aplicaciones asíncronas.&lt;/p&gt;
&lt;p&gt;El resto de enlaces a contenidos interesantes, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/12/propiedades-semi-automaticas-en-c.html&quot;&gt;Propiedades semi-automáticas en C#&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/02/evaluacion-en-cliente-de-ef-core-sus.html&quot;&gt;Evaluación en cliente de EF Core: sus peligros y cómo evitarla&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/01/25/logging-profesional-en-net-disena-telemetria-no-prints/&quot;&gt;Logging profesional en .NET: Diseña Telemetría, no Prints&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/441e0a21-9869-49e4-beac-b30bb9f9494c&quot;&gt;Collection Expression Arguments in C# 15 are &quot;out&quot;&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mfkl.github.io/2026/02/11/vlc-plugin-csharp.html&quot;&gt;Writing a native VLC plugin in C#&lt;/a&gt;&lt;br /&gt;
Martin Finkel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nestenius.se/ai/introducing-the-coding-agent-explorer-net/&quot;&gt;Introducing the Coding Agent Explorer (.NET)&lt;/a&gt;&lt;br /&gt;
Tore Nestenius&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/1fb10ed2-df84-4080-b660-72c04a4cc674&quot;&gt;New runtime async is hitting .NET 11&lt;/a&gt;&lt;br /&gt;Steven Giesel&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://laurentkempe.com/2026/02/14/exploring-net-11-preview-1-runtime-async-a-dive-into-the-future-of-async-in-net/&quot;&gt;Exploring .NET 11 Preview 1 Runtime Async: A dive into the Future of Async in .NET&lt;/a&gt;&lt;br /&gt;
Laurent Kempé&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/14/how-to-implement-abstract-factory-pattern-in-c-stepbystep-guide&quot;&gt;How to Implement Abstract Factory Pattern in C#: Step-by-Step Guide&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/creating-standard-and-observable-instruments/&quot;&gt;Creating standard and &quot;observable&quot; instruments&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.code4it.dev/blog/readonly-vs-immutable-vs-frozen/&quot;&gt;Readonly vs Immutable vs Frozen in C#: differences and (a lot of) benchmarks&lt;/a&gt;&lt;br /&gt;
Davide Bellone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.i-programmer.info/programming/100-c/870-multicast-delegates-and-events.html&quot;&gt;Deep C# - Multicast Delegates and Events&lt;/a&gt;&lt;br /&gt;
Mike James&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/2026/02/t4-templates-on-modern-dotnet-10&quot;&gt;T4 templates on modern .NET&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://barretblake.dev/posts/development/2026/02/hangfire/&quot;&gt;Getting Started with .NET Scheduling in Hangfire&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dependency-management-nuget-security/&quot;&gt;NuGet Packages: The Suppliers You Forgot to Audit&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/swagger-missing-dotnet-10-how-to-add-it-back&quot;&gt;Swagger&#39;s missing in .NET 10&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://baaijte.net/blog/microsoft-fluentui-aspnetcore.components-4.14/&quot;&gt;What&#39;s new for the Microsoft Fluent UI Blazor library 4.14&lt;/a&gt;&lt;br /&gt;
Vincent Baaij&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/02/16/add-application-security-to-the-swiyu-generic-management-verifier-apis-using-oauth/&quot;&gt;Add application security to the swiyu generic management verifier APIs using&amp;nbsp;OAuth&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/13/aspnet-core-with-needlr-simplified-web-application-setup&quot;&gt;ASP.NET Core with Needlr: Simplified Web Application Setup&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/how-to-set-up-production-ready-monitoring-with-aspnetcore-health-checks&quot;&gt;How to Set Up Production-Ready Monitoring With ASP.NET Core Health Checks&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/creating-drag-drop-listboxes-blazor&quot;&gt;Creating Drag-and-Drop ListBoxes in Blazor&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/02/16/building-real-world-web-apps-with-aspnet-core-razor-pages.aspx&quot;&gt;Building Real-World Web Apps with ASP.NET Core Razor Pages&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/network-isolation-azure-vnet/&quot;&gt;Your Azure SQL Is Public Right Now. ISO 27017 Demands You Fix It&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.systemdesign.one/p/timsort-algorithm&quot;&gt;Timsort Algorithm&lt;/a&gt;&lt;br /&gt;
Neo Kim&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/databases/sql-server/long-running-query-detection-in-sql-server/&quot;&gt;SQL Server Long-Running Query Detection: How to Find and Monitor Slow Queries&lt;/a&gt;&lt;br /&gt;
Edward Pollack&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/karenpayneoregon/aspnet-core-warmup-ef-core-58gl&quot;&gt;ASP.NET Core warmup EF Core&lt;/a&gt;&lt;br /&gt;
Karen Payne&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/es-ES/index/introducing-gpt-5-3-codex-spark/&quot;&gt;Presentamos GPT‑5.3‑Codex‑Spark&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-pro/&quot;&gt;Gemini 3.1 Pro: Announcing our latest Gemini AI model&lt;/a&gt;&lt;br /&gt;
Gemini Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/02/13/local-embeddings-in-net-the-easy-way/&quot;&gt;Local Embeddings in .NET — The Easy Way&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://elbruno.com/2026/02/14/%f0%9f%a7%a0-building-rag-in-net-with-local-embeddings-3-approaches-zero-cloud-calls/&quot;&gt;Building RAG in .NET with Local Embeddings — 3 Approaches, Zero Cloud Calls&lt;/a&gt; &amp;amp; * &lt;a href=&quot;https://elbruno.com/2026/02/16/%f0%9f%96%bc%ef%b8%8f-local-image-embeddings-in-net-clip-onnx/&quot;&gt;Local Image Embeddings in .NET — CLIP + ONNX&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/ai/2026/02/the-most-popular-ai-tools-what-developers-use-and-why/&quot;&gt;The Most Popular AI Tools: What Developers Use and Why&lt;/a&gt;&lt;br /&gt;
Conrad Schwellnus&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://christianheilmann.com/2026/02/16/webmcp-a-much-needed-way-to-make-agents-play-with-rather-than-against-the-web/&quot;&gt;WebMCP – a much needed way to make agents play with rather than against the web&lt;/a&gt;&lt;br /&gt;
Christian Heilmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://theredbeard.io/blog/i-intercepted-3177-api-calls-across-4-ai-coding-tools/&quot;&gt;I Intercepted 3,177 API Calls Across 4 AI Coding Tools. Here&#39;s What&#39;s Actually Filling Your Context Window.&lt;/a&gt;&lt;br /&gt;
Lars de Ridder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/02/17/decision-tree-regression-from-scratch.aspx&quot;&gt;Decision Tree Regression from Scratch Without Pointers or Recursion Using C#&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/foundry/microsoft-agent-framework-reaches-release-candidate/&quot;&gt;Microsoft Agent Framework Reaches Release Candidate&lt;/a&gt;&lt;br /&gt;
Shawn Henry&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/semantic-kernel/migrate-your-semantic-kernel-and-autogen-projects-to-microsoft-agent-framework-release-candidate/&quot;&gt;Migrate your Semantic Kernel and AutoGen projects to Microsoft Agent Framework Release Candidate&lt;/a&gt;&lt;br /&gt;
Dmytro Struk &amp;amp; Shawn Henry&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.enmilocalfunciona.io/accesibilidad-web-del-futuro-nuevas-pautas-ia-y-diseno-sin-barreras/&quot;&gt;Accesibilidad web 2026: WCAG 2.2, IA y ley europea&lt;/a&gt;&lt;br /&gt;
Marco Romero&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/performance-optimized-video-embeds-with-zero-javascript/&quot;&gt;Performance-Optimized Video Embeds with Zero JavaScript&lt;/a&gt;&lt;br /&gt;
Stefan Bauer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/jquery-4-support-whats-new-how-kendo-ui-has-you-covered&quot;&gt;jQuery 4.0.0 Support: What’s New + Kendo UI Has You Covered&lt;/a&gt;&lt;br /&gt;
Nikolay Penev&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/fun-with-typescript-generics/&quot;&gt;Fun with TypeScript Generics&lt;/a&gt;&lt;br /&gt;
Adam Rackis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/anchored-menus-and-a-lesson-in-scoping/&quot;&gt;Anchored Menus and a Lesson in Scoping&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/optimizing-javascript-edge-runtime&quot;&gt;Optimizing JavaScript for the Edge Runtime&lt;/a&gt;&lt;br /&gt;
Jonathan Gamble&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matklad.github.io/2026/02/14/justifying-text-wrap-pretty.html&quot;&gt;Justifying text-wrap: pretty&lt;/a&gt;&lt;br /&gt;
Alex Kladov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/react-animation-libraries-comparison&quot;&gt;Choosing a React Animation Library: Performance Trade-Offs in Real Apps&lt;/a&gt;&lt;br /&gt;
Sumankumar G.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/spiral-scrollytelling-in-css-with-sibling-index/&quot;&gt;Spiral Scrollytelling in CSS With sibling-index()&lt;/a&gt;&lt;br /&gt;
Lee Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/interop-2026/&quot;&gt;Interop 2026&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/web-platform-01-2026?hl=en&quot;&gt;New to the web platform in January&lt;/a&gt;&lt;br /&gt;
Rachel Andrew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.raymondcamden.com/2026/02/16/three-plug-n-play-css-libraries&quot;&gt;Three Plug-N-Play CSS Libraries&lt;/a&gt;&lt;br /&gt;
Raymond Camden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/distinguishing-components-and-utilities-in-tailwind/&quot;&gt;Distinguishing &quot;Components&quot; and &quot;Utilities&quot; in Tailwind&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.angular.dev/angular-21-internal-mechanics-aria-and-ai-powered-coding-eefc4b05ddb6&quot;&gt;Angular 21: Internal Mechanics, ARIA, and AI-Powered Coding!&lt;/a&gt;&lt;br /&gt;
Angular Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.postman.com/api-security-best-practices/&quot;&gt;API Security Best Practices: A Developer’s Guide to Protecting Your APIs&lt;/a&gt;&lt;br /&gt;
The Postman Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/potentially-coming-to-a-browser-near-you/&quot;&gt;Potentially Coming to a Browser&amp;nbsp;:near()&amp;nbsp;You&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/death-to-scroll-fade/&quot;&gt;Death to Scroll Fade!&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/tus-contenedores-no-son-tan-seguros-como-crees-estrategias-de-mitigacion-para-docker-y-kubernetes.aspx&quot;&gt;Tus contenedores no son tan seguros como crees: estrategias de mitigación para Docker y Kubernetes&lt;/a&gt;&lt;br /&gt;
CampusMVP&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/azure-sql/dear-copilot-azure-sql/&quot;&gt;Dear Copilot, can you help me with SQL?&lt;/a&gt;&lt;br /&gt;
Thiago Henrique da Silva&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/csharp-expressions-xaml-dotnet11-maui&quot;&gt;.NET 11 Preview for .NET MAUI: Simplify XAML with Inline C# Expressions&lt;/a&gt;&lt;br /&gt;
Sri Radhesh Nag Subash Sankar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/02/automatas-victorianos-gargantas-de.html&quot;&gt;Autómatas victorianos, gargantas de cuero y redes neuronales: Anatomía secreta de las máquinas parlantes&lt;/a&gt;&lt;br /&gt;
María Gómez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.techworld-with-milan.com/p/you-can-code-only-4-hours-per-day&quot;&gt;You can code only 4 hours per day. Here’s why.&lt;/a&gt;&lt;br /&gt;
Milan Milanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/saaspocalipsis-el-mercado-ya-ha-descontado-algo-que-a%C3%BAn-diaz-martin-nvove/&quot;&gt;SaaSpocalipsis: el mercado ya ha descontado algo que muchos desarrolladores aún no han interiorizado&lt;/a&gt;&lt;br /&gt;
Alberto Díaz Martín&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/8082408171120713411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/8082408171120713411' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8082408171120713411'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8082408171120713411'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/enlaces-interesantes-638.html' title='Enlaces interesantes 638'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnBSoO56QpMdSUXvcqk0rZQG60wBf1ejaNFvWhfcUVcoQCr35QSyybDbmP_y1IDqPBIyXdfurMLDjwWojchEFmkqL_vt1YZiSzgXuWCVF_sVQwtuNopb5fRtMOfy7AmjOQabv2wxxJQBjc78akbnp1EP2LB3Qk7yG0cLP6iMaUtsjRSLk9YgP-KA/s72-c/flow-programming.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-2501636360588131926</id><published>2026-02-17T08:05:00.002+01:00</published><updated>2026-02-17T08:05:00.116+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="lambdas"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><title type='text'>Lambdas estáticas en C#: cómo y cuándo usarlas</title><content type='html'>&lt;img alt=&quot;Una lambda petrificada&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5XgeOfMHYNGjthWsJGe1DHPOlWOAy0c-OHBq1h7C-q4d1x1_2YWLQIMIjfAr2j8Zm5GbagCW4JCJMnEW4q5xiV91XwbMjoL2Jetoe3ZY9klyaucZIoTuPfFDclbWEo-wxDBWBbAy1lVfAw5lrkHyW93Vm4QdYDln2lU9dQe3nmklTvb1_5kw9_g/s800/static-lambda.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;No es algo que se utilice habitualmente, y a veces incluso es un detalle desconocido por los desarrolladores, pero &lt;strong&gt;las funciones &lt;em&gt;lambda&lt;/em&gt; de C# pueden ser estáticas&lt;/strong&gt;. Y no es porque sea algo nuevo, pues esta característica se introdujo en la versión 9.0 del lenguaje en 2020... simplemente son esos pequeños detalles que se van añadiendo al lenguaje sin hacer mucho ruido, y que a veces pasan desapercibidos.&lt;/p&gt;
&lt;p&gt;De hecho, el uso de &lt;em&gt;lambdas&lt;/em&gt; estáticas puede ayudarnos a escribir un código más seguro y predecible, además de tener cierto impacto en el rendimiento de nuestras aplicaciones, por lo que merece la pena conocerlas y saber cuándo y cómo usarlas.&lt;/p&gt;
&lt;p&gt;En este post vamos a ver qué son las &lt;em&gt;lambdas&lt;/em&gt; estáticas, cómo se implementan y cuándo y por qué deberíamos usarlas.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Lambdas estáticas&lt;/h2&gt;
&lt;p&gt;Al igual que ocurre con los métodos o funciones en C#, las funciones &lt;em&gt;lambda&lt;/em&gt; pueden ser estáticas, es decir, pueden &lt;strong&gt;vivir fuera del contexto de una instancia&lt;/strong&gt; de clase, y se implementan simplemente añadiendo la palabra clave &lt;code&gt;static&lt;/code&gt; delante de la definición de la &lt;em&gt;lambda&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var suma = static (x, y) =&amp;gt; x + y;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto mismo podemos verlo en escenarios más complejos, como en consultas LINQ sobre colecciones u orígenes de datos, ya sea usándolas &lt;a href=&quot;https://www.variablenotfound.com/2009/03/c-desmitificando-las-expresiones-lambda_29.html&quot;&gt;como delegados&lt;/a&gt; o bien &lt;a href=&quot;https://www.variablenotfound.com/2009/03/c-desmitificando-las-expresiones-lambda_2829.html&quot;&gt;como árboles de expresión&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;int[] nums = [1, 2, 3, 4, 5];
var sum = nums.Where(static x =&amp;gt; x % 2 == 0).Sum(); // Suma los pares
Console.WriteLine(sum); // Imprime 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En cualquier caso, la declaración de una &lt;em&gt;lambda&lt;/em&gt; como estática hace que aparezcan ciertas restricciones en su implementación. En primer lugar, las &lt;em&gt;lambdas&lt;/em&gt; estáticas &lt;strong&gt;no pueden capturar variables de instancia&lt;/strong&gt;, pues &lt;strong&gt;no tienen acceso a &lt;code&gt;this&lt;/code&gt; ni a las variables o métodos de instancia&lt;/strong&gt; de la clase en la que se definen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tampoco pueden capturar variables locales ni parámetros&lt;/strong&gt; del método que las contiene, a menos que se pasen explícitamente como argumentos.&lt;/p&gt;
&lt;p&gt;En otras palabras, &lt;strong&gt;deben ser funciones puras, que dependen únicamente de sus parámetros de entrada&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Esto, que a priori puede parecer una limitación, en realidad es una de las principales ventajas de las &lt;em&gt;lambdas&lt;/em&gt; estáticas, ya que, al no depender de ningún factor externo, su comportamiento será más predecible y fácil de implementar y depurar.&lt;/p&gt;
&lt;p&gt;Observa por ejemplo el siguiente caso, en el que la &lt;em&gt;lambda&lt;/em&gt; &lt;code&gt;duplicate&lt;/code&gt; captura la variable &lt;code&gt;factor&lt;/code&gt; del contexto que la contiene, y hace que su valor dependa de ella:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;int factor = 2;
var duplicate = (int x) =&amp;gt; x * factor; // No captura el valor de &#39;factor&#39;, 
                                       // sino la referencia a la variable

Console.WriteLine(duplicate(2)); // Imprime 4
factor = 3;
Console.WriteLine(duplicate(2)); // Imprime 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fíjate que aunque llamamos a la &lt;em&gt;lambda&lt;/em&gt; &lt;code&gt;duplicate&lt;/code&gt; con el mismo parámetro, el resultado es diferente porque la variable &lt;code&gt;factor&lt;/code&gt; ha cambiado su valor en el segundo caso.&lt;/p&gt;
&lt;p&gt;Esto puede provocar errores difíciles de detectar y depurar. De hecho, el entorno de desarrollo (IDE) nos avisa de que la &lt;em&gt;lambda&lt;/em&gt; está capturando una variable del contexto cuyo valor es modificado, por lo que puede provocar efectos inesperados:&lt;/p&gt;
&lt;p&gt;
  
  &lt;img alt=&quot;Captura de variable en lambda&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglnkdSn-kSeTLs-O5vigFwILWN7RZWIE0b7msafA_m_5L4V-aKxZAB5kp90G6igOal48sA-XfBrKKimtgvwcVl7x9PhuqpOWryIQxKnbtDjKFMsbjEZJ2slnOqPf7ZQIjTp0l0l_F10mc-ez9ipLuzMxeN8d2E0ENf97MekFOKMQRCNTDzNb3R5A/s928/warning-capture.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;Al convertir la &lt;em&gt;lambda&lt;/em&gt; en estática, el compilador nos avisará de que no puede capturar variables del contexto, por lo que nos veremos obligados a usar constantes o bien a pasar los valores como parámetros; en cualquiera de los dos casos, &lt;strong&gt;la &lt;em&gt;lambda&lt;/em&gt; será siempre una función pura y su comportamiento será totalmente predecible&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;int factor = 2;
var duplicate = static (int x) =&amp;gt; x * factor; // Error CS8820: A static anonymous function
                                              // cannot contain a reference to &#39;factor&#39;.

var duplicate = static (int x) =&amp;gt; x * 2; // Correcto, factor es un valor constante
var multiply = static (int x, int factor) =&amp;gt; x * factor; // Correcto, factor se pasa como parámetro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero además, es importante saber que, cuando se invoca una &lt;em&gt;lambda&lt;/em&gt; que captura alguna referencia externa, el compilador genera un objeto de cierre (o &lt;em&gt;closure&lt;/em&gt;) para almacenar esas referencias, lo que implica una sobrecarga adicional en tiempo de ejecución y un mayor consumo de memoria.&lt;/p&gt;
&lt;p&gt;Por tanto, cuando usemos &lt;em&gt;lambdas&lt;/em&gt; estáticas, además de tener un código más seguro y determinista, podemos estar seguros de que no se generará ningún objeto de cierre, por lo que el rendimiento y consumo de memoria serán óptimos.&lt;/p&gt;
&lt;h2&gt;Benchmarks&lt;/h2&gt;
&lt;p&gt;El impacto del uso de objetos de cierre en el rendimiento y consumo de memoria puede ser significativo en escenarios donde se usan muchas &lt;em&gt;lambdas&lt;/em&gt; que capturan referencias, como en bucles o en operaciones con colecciones. Esto puede verse en el siguiente resultado de un &lt;em&gt;benchmark&lt;/em&gt;, donde comparamos cuatro escenarios diferentes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;una &lt;em&gt;lambda&lt;/em&gt; normal sin capturas,&lt;/li&gt;
&lt;li&gt;otra &lt;em&gt;lambda&lt;/em&gt; normal que captura una propiedad de instancia,&lt;/li&gt;
&lt;li&gt;una tercera que captura una variable local,&lt;/li&gt;
&lt;li&gt;y una &lt;em&gt;lambda&lt;/em&gt; estática sin capturas.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method                       | Mean      | Error     | StdDev    | Median    | Gen0   | Allocated |
|----------------------------- |----------:|----------:|----------:|----------:|-------:|----------:|
| NormalLambdaWithNoCapture    | 0.0031 ns | 0.0033 ns | 0.0027 ns | 0.0023 ns |      - |         - |
| NormalLambdaWithCapture      | 4.8063 ns | 0.0654 ns | 0.0612 ns | 4.8035 ns | 0.0077 |      64 B |
| NormalLambdaWithLocalCapture | 7.0980 ns | 0.1036 ns | 0.0969 ns | 7.0805 ns | 0.0105 |      88 B |
| StaticLambda                 | 0.0039 ns | 0.0035 ns | 0.0033 ns | 0.0046 ns |      - |         - |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lo primero que llama la atención es que las &lt;em&gt;lambdas&lt;/em&gt; normales que capturan referencias (ya sean de instancia o locales) son muchísimo más lentas que las que no capturan nada, y además generan consumo de memoria (reservan memoria en el &lt;em&gt;heap&lt;/em&gt; y provocan recolecciones de basura).&lt;/p&gt;
&lt;p&gt;Las &lt;em&gt;lambdas&lt;/em&gt; que no capturan referencias prácticamente consiguen el mismo rendimiento, con una diferencia inapreciable. Y, eso sí, ninguna de las dos genera sobrecarga ni consumo de memoria.&lt;/p&gt;
&lt;h2&gt;Entonces, ¿cuándo deberíamos usar lambdas estáticas?&lt;/h2&gt;
&lt;p&gt;En general, salvo que necesitemos capturar referencias del contexto, será conveniente &lt;b&gt;utilizar &lt;em&gt;lambdas&lt;/em&gt; estáticas siempre&lt;/b&gt;, ya que nos aseguramos de que nuestro código es más seguro y predecible, sin perder en eficiencia o consumo de memoria.&lt;/p&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/2501636360588131926/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/2501636360588131926' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2501636360588131926'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2501636360588131926'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/lambdas-estaticas-en-c-como-y-cuando.html' title='Lambdas estáticas en C#: cómo y cuándo usarlas'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5XgeOfMHYNGjthWsJGe1DHPOlWOAy0c-OHBq1h7C-q4d1x1_2YWLQIMIjfAr2j8Zm5GbagCW4JCJMnEW4q5xiV91XwbMjoL2Jetoe3ZY9klyaucZIoTuPfFDclbWEo-wxDBWBbAy1lVfAw5lrkHyW93Vm4QdYDln2lU9dQe3nmklTvb1_5kw9_g/s72-c/static-lambda.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7700779729150897977</id><published>2026-02-16T08:05:00.057+01:00</published><updated>2026-02-16T08:31:17.412+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 637</title><content type='html'>&lt;img alt=&quot;Desarrollador senior recordando cómo era programar cuarenta años atrás&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY3kHFgv4iJMziP_hWMBW9vYDtjPlKPFIh90aGdau-C6kSl9Rv__dcbdRuoEuo1HXMwtM29bL5oCcr611I2UJzQxDgf1zjAt7IOtBwxNOVbfUljfgqWpntoSnddZQ6peeQXlGa8Bv6SGw93dwlqgly3SqfADiVNugNyHwfsh-Zf89_6TgMnJrZeg/s800/ya-no-es-lo-mismo.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Mucho contenido interesante en la recopilación de enlaces de esta semana, entre los que me gustaría destacar algunas lecturas a las que, como mínimo, vale la pena echar un vistazo.&lt;/p&gt;
&lt;p&gt;Ha llegado la &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-1/&quot; target=&quot;_blank&quot;&gt;primera preview de .NET 11&lt;/a&gt;, con un buen puñado de novedades en el &lt;i&gt;runtime&lt;/i&gt;, librerías, SDK, C#, ASP.NET y Blazor. En el post del anuncio oficial podéis encontrar el listado completo y enlaces para profundizar en cada una de ellas.&lt;/p&gt;
&lt;p&gt;Tenemos un doblete de Ricardo Peres sobre Entity Framework Core. Primero, profundiza en la &lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/02/modern-mapping-with-ef-core.html&quot; target=&quot;_blank&quot;&gt;forma de mapear distintos tipos de relaciones y las novedades que se han introducido en las últimas versiones&lt;/a&gt; para facilitar esta tarea, y luego nos habla sobre la &lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/02/ef-core-state-validation.html&quot; target=&quot;_blank&quot;&gt;validación de estado de entidades&lt;/a&gt; en este framework.&lt;/p&gt;
&lt;p&gt;GitHub Copilot es indudablemente una herramienta alucinante, pero a veces no es fácil saber qué modo de uso es el más adecuado para cada tarea. José Manuel Alarcón &lt;a href=&quot;https://www.campusmvp.es/recursos/post/github-copilot-cuando-usar-los-modos-ask-edit-agent-y-plan-segun-la-tarea.aspx&quot; target=&quot;_blank&quot;&gt;nos lo explica en este artículo&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Y siguiendo con dobletes, el mismo autor nos trae un interesante artículo analizando cómo determinadas &lt;a href=&quot;https://www.campusmvp.es/recursos/post/el-sesgo-de-negatividad-de-reddit-y-como-puede-influir-en-tu-trabajo-como-programador.aspx&quot; target=&quot;_blank&quot;&gt;narrativas negativas amplificadas en redes sociales pueden generar frustración y malas decisiones&lt;/a&gt; en desarrolladores júnior, y propone estrategias prácticas para reconocer ese sesgo y protegerse de él.&lt;/p&gt;
&lt;p&gt;Por último, James Randall comparte &lt;a href=&quot;https://www.jamesdrandall.com/posts/the_thing_i_loved_has_changed/&quot; target=&quot;_blank&quot;&gt;cómo ha cambiado la programación en 40 años y cómo ha cambiado también su relación con ella&lt;/a&gt;. Si tienes ya unos añitos, probablemente te sentirás identificado.&lt;/p&gt;
&lt;p&gt;El resto de enlaces, a continuación.&lt;/p&gt;

&lt;h1&gt;Por si te lo perdiste...&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/02/invalidar-el-contenido-cacheado-por-el.html&quot;&gt;Invalidar el contenido cacheado por el tag helper &quot;cache&quot; de ASP.NET Core MVC&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/12/abrir-gmail-y-google-calendar-con-una.html&quot;&gt;Abrir Gmail y Google Calendar con una cuenta específica, y cómo anclarlos en la barra de tareas de Windows&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-1/&quot;&gt;.NET 11 Preview 1 is now available!&lt;/a&gt;&lt;br /&gt;
.NET Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.developerro.com/2026/02/11/authentication-autorization/&quot;&gt;Autentication y Authorization en .NET&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/08/abstract-factory-vs-factory-method-pattern-in-c-key-differences-explained&quot;&gt;Abstract Factory vs Factory Method Pattern in C#: Key Differences Explained&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnettips.wordpress.com/2026/02/08/boost-your-net-projects-with-spargine-global-phone-number-and-postal-code-validation-made-easy/&quot;&gt;Global Phone Number and Postal Code Validation Made&amp;nbsp;Easy&lt;/a&gt;&lt;br /&gt;
David McCarter&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/pimplementing-strongly-typed-ids-in-net-for-safer-domain-models/&quot;&gt;Implementing strongly-typed IDs in .NET for safer domain models&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/how-to-start-a-new-dotnet-project-in-2026&quot;&gt;How to Start a New .NET Project in 2026&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/09/automatic-service-discovery-in-c-with-needlr-how-it-works&quot;&gt;Automatic Service Discovery in C# with Needlr: How It Works&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://minidump.net/writing-a-net-gc-in-c-part-7/&quot;&gt;Writing a .NET Garbage Collector in C# - Part 7: Marking handles&lt;/a&gt;&lt;br /&gt;
Kevin Gosse&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/tips-to-secure-asp-dotnet-core-apps&quot;&gt;ASP.NET Core Security Explained: Modern Authentication, Authorization, and JWT&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/02/09/isolate-the-swiyu-public-beta-management-apis-using-yarp/&quot;&gt;Isolate the swiyu Public Beta management APIs using&amp;nbsp;YARP&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/secure-image-upload-in-blazor-rte-jwt&quot;&gt;Secure Image Uploads in Blazor Rich Text Editor Using JWT&lt;/a&gt;&lt;br /&gt;
Saravanan G.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/customizing-validation-messages-blazor-forms&quot;&gt;Customizing Validation Messages in Blazor Forms&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/csharp/mastering-asp-net-core-request-pipeline-patterns/&quot;&gt;Mastering the ASP.NET Core Request Pipeline: Middleware, Endpoint Filters, and Scalable API Architecture&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260210-implementing-zero-trust-with-resource-isolation&quot;&gt;Implementing Zero Trust with Resource Isolation&lt;/a&gt;&lt;br /&gt;
Maarten Balliauw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorise.com/news/release-notes/200&quot;&gt;Announcing Blazorise 2.0&lt;/a&gt;&lt;br /&gt;
Mladen Macanović&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/02/cloudflare-for-startups-hasta-250000.html&quot;&gt;Cloudflare for Startups: Hasta 250.000 USD en servicios para tu proyecto&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azureobservabilityblog/announcing-application-insights-sdk-3-x-for-net/4493988&quot;&gt;Announcing Application Insights SDK 3.x for .NET&lt;/a&gt;&lt;br /&gt;
MattMC&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/01/15/cuando-usar-findasync-o-firstordefaultasync-en-ef-core/&quot;&gt;Cuando usar FindAsync o FirstOrDefaultAsync en EF Core&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/02/modern-mapping-with-ef-core.html&quot;&gt;Modern Mapping with EF Core&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/02/ef-core-state-validation.html&quot;&gt;EF Core State Validation&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/how-leftjoin-rightjoin-work-ef-core-dotnet-10&quot;&gt;How LeftJoin and RightJoin Work in EF Core .NET 10&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabsoverspaces.com/233960-entity-framework-core-10-provider-for-firebird-is-ready&quot;&gt;Entity Framework Core 10 provider for Firebird is ready&lt;/a&gt;&lt;br /&gt;
Jiří Činčura&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sqlauthority.com/2026/02/09/sql-server-execution-plans-and-indexing-strategies-quick-guide/&quot;&gt;SQL SERVER – Execution Plans and Indexing Strategies – Quick Guide&lt;/a&gt;&lt;br /&gt;
Pinal Dave&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/modernizationbestpracticesblog/azure-sql%E2%80%99s-native-json-type-optimized-for-performance/4486952&quot;&gt;Azure SQL’s Native JSON Type: Optimized for Performance&lt;/a&gt;&lt;br /&gt;
Shrusti Kolsur&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/data-minimization-entity-framework/&quot;&gt;Stop Hoarding Personal Data in Entity Framework&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/02/haz-que-tus-custom-agents-sean-subagents-de-github-copilot/&quot;&gt;Haz que tus custom agents sean subagents de GitHub Copilot&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/foundry/dotnet-ai-skills-executor-azure-openai-mcp/&quot;&gt;Building an AI Skills Executor in .NET with Azure OpenAI&lt;/a&gt;&lt;br /&gt;
Rand Random&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jamiemaguire.net/index.php/2026/02/08/microsoft-agent-framework-exposing-an-existing-ai-agent-as-an-mcp-tool/&quot;&gt;Microsoft Agent Framework: Exposing an Existing AI Agent as an MCP Tool – Jamie Maguire&lt;/a&gt;&lt;br /&gt;
Jamie Maguire&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/es-ES/index/testing-ads-in-chatgpt/&quot;&gt;Testing ads in ChatGPT&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-beta/&quot;&gt;Announcing TypeScript 6.0 Beta&lt;/a&gt;&lt;br /&gt;
Daniel Rosenwasser&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/trying-to-make-the-perfect-pie-chart-in-css/&quot;&gt;Trying to Make the Perfect Pie Chart in CSS&lt;/a&gt;&lt;br /&gt;
Juan Diego Rodríguez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mescius.com/blogs/what-to-expect-in-angular-22&quot;&gt;What to Expect in Angular 22&lt;/a&gt;&lt;br /&gt;
Kelly Vatter&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/htmx-with-react-nextjs-server-driven-ui&quot;&gt;Integrating HTMX with React and Next.js for Dynamic HTML Updates&lt;/a&gt;&lt;br /&gt;
Satheeskumar S.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/open-and-render-docx-files-with-react&quot;&gt;How to Open and Render DOCX Files in the Browser with React&lt;/a&gt;&lt;br /&gt;
Ramkumar Ravy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/approximating-contrast-color-with-other-css-features/&quot;&gt;Approximating contrast-color() With Other CSS Features&lt;/a&gt;&lt;br /&gt;
Kevin Hamer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/image-optimization-angular-applications&quot;&gt;Image Optimization in Angular Applications&lt;/a&gt;&lt;br /&gt;
Christian Nwamba&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/making-a-responsive-pyramidal-grid-with-modern-css/&quot;&gt;Making a Responsive Pyramidal Grid With Modern CSS&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/github-copilot-cuando-usar-los-modos-ask-edit-agent-y-plan-segun-la-tarea.aspx&quot;&gt;GitHub Copilot: cuándo usar los modos Ask, Edit, Agent y Plan según la tarea&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.windowscentral.com/microsoft/windows-11/5-open-source-apps-everyone-should-use-on-windows-11&quot;&gt;5 open-source Windows 11 apps you didn&#39;t know you needed&lt;/a&gt;&lt;br /&gt;
Mauro Huculak&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.advancedinstaller.com/convert-html-to-exe.html&quot;&gt;How to Convert an HTML to an EXE file&lt;/a&gt;&lt;br /&gt;
Alex Marin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/github-copilot-testing-for-dotnet-available-in-visual-studio/&quot;&gt;GitHub Copilot Testing for .NET Brings AI-powered Unit Tests to Visual Studio 2026&lt;/a&gt;&lt;br /&gt;
McKenna Barlow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/unlock-language-specific-rich-symbol-context-using-new-find_symbol-tool/&quot;&gt;Unlock language-specific rich symbol context using new find_symbol tool&lt;/a&gt;&lt;br /&gt;
Mike Gine&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/build-supply-chain-dashboard-in-maui&quot;&gt;Visualizing Supply Chain Metrics in .NET MAUI with Charts and Gauges&lt;/a&gt;&lt;br /&gt;
Hariram Subramanian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/best-practices-for-responsive-maui-app&quot;&gt;Why Your .NET MAUI Layout Breaks Across Devices and How to Fix It&lt;/a&gt;&lt;br /&gt;
Anandh Ganesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/exploring-compiled-bindings-net-maui&quot;&gt;Exploring Compiled Bindings in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/support-ticket-dashboard-in-maui-grid&quot;&gt;Building a Support Ticket Dashborad with .NET MAUI DataGrid&lt;/a&gt;&lt;br /&gt;
Farjana Parveen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/el-sesgo-de-negatividad-de-reddit-y-como-puede-influir-en-tu-trabajo-como-programador.aspx&quot;&gt;Desarrollador junior y frustrado con tu trabajo: cómo evitar el sesgo de negatividad online&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jamesdrandall.com/posts/the_thing_i_loved_has_changed/&quot;&gt;I Started Programming When I Was 7. I&#39;m 50 Now, and the Thing I Loved Has Changed&lt;/a&gt;&lt;br /&gt;
James Randall&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;



Publicado en: &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;www.variablenotfound.com&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7700779729150897977/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7700779729150897977' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7700779729150897977'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7700779729150897977'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/enlaces-interesantes-637.html' title='Enlaces interesantes 637'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY3kHFgv4iJMziP_hWMBW9vYDtjPlKPFIh90aGdau-C6kSl9Rv__dcbdRuoEuo1HXMwtM29bL5oCcr611I2UJzQxDgf1zjAt7IOtBwxNOVbfUljfgqWpntoSnddZQ6peeQXlGa8Bv6SGw93dwlqgly3SqfADiVNugNyHwfsh-Zf89_6TgMnJrZeg/s72-c/ya-no-es-lo-mismo.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-6422439800951149229</id><published>2026-02-09T08:02:00.022+01:00</published><updated>2026-02-09T08:02:00.110+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 636</title><content type='html'>&lt;img alt=&quot;Agente OpenClaw realizando distintas tareas mientras el usuario hace crucigramas&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8cg0uer7klF2TNT6WLhVzOJDUjMGEYtgEkpFigrDF4oGO5ztpW_9nU3O-L8EhRhRbotRXEBCqaNJeUJsq2LyDCvAztTIqQ0OzoR0SXtQ4NGVtC2egjxehwV6SfPx_qGjsyif40lcv2VK1HiDyyRm747V8fOT8nJabUg0AFEwCXTe5DtbySVEf9g/s800/openclaw.jpg&quot; width=&quot;100%&quot; /&gt;



&lt;p&gt;En los enlaces interesantes de esta semana, creo que vale la pena destacar &lt;a href=&quot;https://openclaw.ai/blog/introducing-openclaw&quot; target=&quot;_blank&quot;&gt;el post de Peter Steinberger anunciando OpenClaw&lt;/a&gt;, el nuevo nombre de Moltbot, que a su vez fue un nuevo nombre para Clawd. En cualquier caso, una plataforma abierta que, con sus luces y sus sombras, ha traído aire fresco al mundo de los agentes personales inteligentes alojados en nuestra propia infraestructura.&lt;/p&gt;
&lt;p&gt;También, gracias a Kevin W. Griffin, esta semana he descubierto &lt;a href=&quot;https://consultwithgriff.com/sql-pagination-count-over-trick/&quot; target=&quot;_blank&quot;&gt;la función COUNT(*) OVER() de SQL Server&lt;/a&gt;, que permite obtener el número total de filas en una consulta sin necesidad de hacer una consulta previa adicional, muy útil para paginación de datos.&lt;/p&gt;
&lt;p&gt;Teresa Torres, por su parte, ha publicado un post muy interesante explicando &lt;a href=&quot;https://www.producttalk.org/how-does-chatgpt-work/&quot; target=&quot;_blank&quot;&gt;cómo funciona ChatGPT&lt;/a&gt;, con un lenguaje bastante más accesible para humanos &quot;normales&quot; que lo que solemos encontrar por la red.&lt;/p&gt;
&lt;p&gt;Por último, David Grace nos recuerda que &lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/are-exceptions-exposing-vulnerabilities-dotnet-app&quot; target=&quot;_blank&quot;&gt;nuestras excepciones pueden exponer información sensible&lt;/a&gt; que podría ser utilizada por algún desalmado, y cómo evitarlo utilizando herramientas proporcionadas por ASPNET Core.&lt;/p&gt;
&lt;p&gt;El resto de enlaces, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/11/el-codigo-fuente-de-net-muy-mano.html&quot;&gt;El código fuente de .NET muy a mano: source.dot.net&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/02/registro-y-obtencion-de-multiples.html&quot;&gt;Registro y obtención de múltiples implementaciones de servicios en ASP.NET Core, y un caso práctico&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/creating-strongly-typed-metics-with-a-source-generator/&quot;&gt;Exploring the (underwhelming) System.Diagnostics.Metrics source generators&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/02/03/automatic-dependency-injection-in-c-the-complete-guide-to-needlr&quot;&gt;Automatic Dependency Injection in C#: The Complete Guide to Needlr&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-framework-3-5-moves-to-standalone-deployment-in-new-versions-of-windows/&quot;&gt;.NET Framework 3.5 Moves to Standalone Deployment in new versions of Windows&lt;/a&gt;&lt;br /&gt;
Tara Overfield &amp;amp; Brett Lopez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/cryptography-dotnet-data-protection/&quot;&gt;Your Encryption Is Broken — .NET Data Protection Done Right&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/Feb/04/Reliably-Refreshing-the-WebView2-Control&quot;&gt;Reliably Refreshing the WebView2 Control&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.stevejgordon.co.uk/encrypting-properties-with-system-text-json-and-a-typeinforesolver-modifier-part-2&quot;&gt;Encrypting Properties with System.Text.Json and a TypeInfoResolver Modifier (Part 2)&lt;/a&gt;&lt;br /&gt;
Steve Gordon&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor / Aspire&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/02/02/use-client-assertions-in-asp-net-core-using-openid-connect-oauth-dpop-and-oauth-par/&quot;&gt;Use client assertions in ASP.NET Core using OpenID Connect, OAuth DPoP and OAuth&amp;nbsp;PAR&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/ai-powered-smart-textarea-aspdotnetcore&quot;&gt;AI-Powered Smart TextArea for ASP.NET Core: Smarter Typing with Intelligent Autocompletion&lt;/a&gt;&lt;br /&gt;
Arun Kumar Chandrakesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/getting-started-with-dotnet-aspire-13-building-and-deploying-an-app&quot;&gt;Getting Started With .NET Aspire 13: Building and Deploying an App With PostgreSQL, Redis, and Docker Compose&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/are-exceptions-exposing-vulnerabilities-dotnet-app&quot;&gt;Are exceptions exposing vulnerabilities in your .NET App?&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/aspire/securing-dotnet-aspire-apps-with-microsoft-entra-id/&quot;&gt;Securing Aspire Apps with Microsoft Entra ID&lt;/a&gt;&lt;br /&gt;
Jean-Marc Prieur&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/secrets-management-azure-keyvault/&quot;&gt;Your appsettings.json Is a Compliance Violation&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/your-idempotent-code-is-lying-to-you/&quot;&gt;Your Idempotent Code Is Lying To You&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amandeepsp.github.io/blog/hnsw/&quot;&gt;Hierarchical Navigable Small Worlds&lt;/a&gt;&lt;br /&gt;
Amandeep Singh&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://consultwithgriff.com/sql-pagination-count-over-trick/&quot;&gt;SQL Server Pagination with COUNT(*) OVER() Window Function&lt;/a&gt;&lt;br /&gt;
Kevin Griffin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.brentozar.com/archive/2026/02/i-just-dont-understand-why-you-dont-update-ssms/&quot;&gt;I Just Don’t Understand Why You Don’t Update SSMS&lt;/a&gt;&lt;br /&gt;
Brent Ozar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11602/sql-concatenate-string-using-double-pipe/&quot;&gt;SQL Concatenate String using Double Pipe (||) Operator in SQL Server 2025&lt;/a&gt;&lt;br /&gt;
Rajendra Gupta&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/azure-sql/soft-delete-in-azure-sql/&quot;&gt;Enable Soft Delete in Azure SQL&lt;/a&gt;&lt;br /&gt;
Jerry Nixon&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/02/%f0%9f%94%8c-mcp-server-como-proxy-de-otro-mcp-server/&quot;&gt;MCP Server como Proxy de otro MCP Server&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/es-ES/index/introducing-the-codex-app/&quot;&gt;Presentamos la aplicación Codex&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-6&quot;&gt;Claude Opus 4.6&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openclaw.ai/blog/introducing-openclaw&quot;&gt;Introducing OpenClaw&lt;/a&gt;&lt;br /&gt;
Peter Steinberger&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/openclaw-full-tutorial-for-beginners/&quot;&gt;OpenClaw Full Tutorial for Beginners&lt;/a&gt;&lt;br /&gt;
Beau Carnes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/02/02/linear-regression-with-pseudo-inverse-training-using-javascript.aspx&quot;&gt;Linear Regression with Pseudo-Inverse Training Using JavaScript&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.producttalk.org/how-does-chatgpt-work/&quot;&gt;How Does ChatGPT Work? A Guide for the Rest of Us&lt;/a&gt;&lt;br /&gt;
Teresa Torres&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript / UX&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/incremental-hydration-in-angular-apps&quot;&gt;Incremental Hydration in Angular: Build SSR Apps That Feel Instantly Interactive&lt;/a&gt;&lt;br /&gt;
Ankit Sharma&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/build-a-pdf-viewer-editor-in-angular&quot;&gt;Build a Full-Featured PDF Editor in Angular for Modern Web Apps&lt;/a&gt;&lt;br /&gt;
Arun Kumar Chandrakesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/02/combobox-vs-multiselect-vs-listbox/&quot;&gt;Combobox vs. Multiselect vs. Listbox: How To Choose The Right One&lt;/a&gt;&lt;br /&gt;
Vitaly Friedman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cassidoo.co/post/css-corner-shape/&quot;&gt;Making interesting borders with CSS corner-shape&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/react-basics-memoization-react&quot;&gt;React Basics: Memoization in React&lt;/a&gt;&lt;br /&gt;
David Adeneye Abiodun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/css-bar-charts-using-modern-functions/&quot;&gt;CSS Bar Charts Using Modern Functions&lt;/a&gt;&lt;br /&gt;
Preethi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/vue-basics-comprehensive-guide-vue-3-directives&quot;&gt;Vue Basics: A Comprehensive Guide to Vue 3 Directives&lt;/a&gt;&lt;br /&gt;
David Adeneye Abiodun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/02/css-scope-alternative-naming-conventions/&quot;&gt;CSS @scope: An Alternative To Naming Conventions And Heavy Abstractions&lt;/a&gt;&lt;br /&gt;
Blake Lundquist&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/why-your-ui-wont-update-debugging-stale-data-and-caching-in-react-apps/&quot;&gt;Why Your UI Won’t Update: Debugging Stale Data and Caching in React Apps&lt;/a&gt;&lt;br /&gt;
Oluwadamisi Samuel&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No-Hassle Visual Studio Code Theming: &lt;a href=&quot;https://css-tricks.com/no-hassle-visual-studio-code-theming-building-an-extension/&quot;&gt;Building an Extension&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://css-tricks.com/no-hassle-visual-code-theming-publishing-an-extension/&quot;&gt;Publishing an Extension&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/roadmap-for-ai-in-visual-studio-february/&quot;&gt;Roadmap for AI in Visual Studio (February)&lt;/a&gt;&lt;br /&gt;
Rhea Patel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/winget-configuration-set-up-your-dev-machine-in-one-command&quot;&gt;WinGet Configuration: Set up your dev machine in one command&lt;/a&gt;&lt;br /&gt;
Rob Bernstein&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codetraveler.io/2026/01/29/introducing-bindable-property-source-generators/&quot;&gt;Introducing Bindable Property Source Generators&lt;/a&gt;&lt;br /&gt;
Brandon Minnick&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/maui-combobox-json-rest-api&quot;&gt;Loading Dynamic Data into a .NET MAUI ComboBox with JSON and REST APIs&lt;/a&gt;&lt;br /&gt;
Sudarsan Muthuselvan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/replicating-valentine-inspired-login-ui-net-maui&quot;&gt;Replicating a Valentine-Inspired Login UI in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/evolucion-de-los-puestos-de-trabajo-tecnologicos-en-espana-2022-2026.aspx&quot;&gt;Tendencias clave en puestos de trabajo tecnológicos en España (2022-2026)&lt;/a&gt;&lt;br /&gt;
CampusMVP&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/introducing-the-developer-knowledge-api-and-mcp-server/&quot;&gt;Introducing the Google Developer Knowledge API and MCP Server&lt;/a&gt;&lt;br /&gt;
Jess Kuras&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/6422439800951149229/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/6422439800951149229' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6422439800951149229'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6422439800951149229'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/enlaces-interesantes-636.html' title='Enlaces interesantes 636'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8cg0uer7klF2TNT6WLhVzOJDUjMGEYtgEkpFigrDF4oGO5ztpW_9nU3O-L8EhRhRbotRXEBCqaNJeUJsq2LyDCvAztTIqQ0OzoR0SXtQ4NGVtC2egjxehwV6SfPx_qGjsyif40lcv2VK1HiDyyRm747V8fOT8nJabUg0AFEwCXTe5DtbySVEf9g/s72-c/openclaw.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-3590103656004345361</id><published>2026-02-03T08:05:00.001+01:00</published><updated>2026-02-03T08:05:00.118+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buenas prácticas"/><category scheme="http://www.blogger.com/atom/ns#" term="recomendaciones"/><title type='text'>¿Cuántos parámetros son demasiados parámetros?</title><content type='html'>&lt;img alt=&quot;Un profesor en una pizarra mostrando funciones con distinto número de parámetros&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscTryQJPQkC0QmeHY4bGVET8KVC_tTGz6DGOopBe_uCjobAUKVLNtKyNS1_Ivz2adncBWJSxIYq-kFmHvKl-dKT28Jpes9L75iipisLhEZPR9lEy4jyNsRFIhfiGFb2-06NXa_OmXTfmhvhMIk-vvnuXBhEsDNfsEmy4YfEH-Pt_76Ck5psHViw/s800/cuantos-parametros.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Muchas veces habéis escrito métodos o funciones en las que recibís un parámetro, dos parámetros, tres, cuatro... Y seguro que alguna vez habéis llegado a un punto en el que habéis tenido la sensación de que el número de parámetros se os ha ido de las manos. En este momento, estaremos percibiendo el &lt;a href=&quot;https://www.variablenotfound.com/2008/05/qu-huele-tu-cdigo.html&quot;&gt;&lt;em&gt;code smell&lt;/em&gt;&lt;/a&gt; llamado &quot;Long Parameter List&quot; o &quot;Lista de Parámetros Larga&quot;, todo un clásico en el aromático arte de la programación ;)&lt;/p&gt;
&lt;p&gt;Porque, indudablemente, cuando un método o función recibe demasiados parámetros puede volverse difícil de leer, entender y mantener, y son muy propensos a errores de codificación, sobre todo si los tipos de datos de los parámetros son similares o si su orden no es claro o intuitivo.&lt;/p&gt;
&lt;p&gt;Pero, ¿cuántos parámetros son demasiados parámetros? ¿Cinco? ¿Diez? ¿Veinte? Como suele ocurrir, no existe una respuesta única y categórica sobre el tema, aunque sí existen algunas recomendaciones que pueden ayudarnos a tomar una decisión cuando nos enfrentamos a esta situación.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Los problemas de tener demasiados parámetros&lt;/h2&gt;
&lt;p&gt;Un método o función que recibe demasiados parámetros se considera generalmente un &lt;em&gt;code smell&lt;/em&gt;. No es un error en sí mismo, pero suele indicar que algo no está bien diseñado y que probablemente necesite una revisión o refactorización.&lt;/p&gt;
&lt;p&gt;El problema más evidente de tener demasiados parámetros es que automáticamente es &lt;strong&gt;más difícil de leer y entender&lt;/strong&gt;. Cada parámetro adicional añade complejidad y puede hacer que el propósito del método o función sea menos claro, lo que puede llevar a confusiones y errores al utilizarlo. También, &lt;strong&gt;el código será más extenso&lt;/strong&gt;, lo que puede extender el aroma a otros &lt;em&gt;smells&lt;/em&gt; como &lt;a href=&quot;https://luzkan.github.io/smells/long-method&quot;&gt;Long Method&lt;/a&gt;, &lt;a href=&quot;https://luzkan.github.io/smells/primitive-obsession&quot;&gt;Primitive obsession&lt;/a&gt;, &lt;a href=&quot;https://luzkan.github.io/smells/feature-envy&quot;&gt;Feature Envy&lt;/a&gt; y más fragancias desagradables.&lt;/p&gt;
&lt;p&gt;Además, si los parámetros son de tipos similares o tienen nombres poco descriptivos, es fácil que al invocar la función &lt;strong&gt;se ordenen de forma incorrecta&lt;/strong&gt;, lo que en muchos casos puede provocar errores difíciles de detectar y corregir.&lt;/p&gt;
&lt;p&gt;Y por supuesto, puede generar &lt;strong&gt;problemas de mantenimiento y escalabilidad&lt;/strong&gt; del código. Si un método o función tiene muchos parámetros, cualquier cambio en su firma (añadir, eliminar o modificar parámetros) puede requerir cambios en múltiples ubicaciones, lo que aumenta la complejidad y el riesgo de introducir nuevos errores.&lt;/p&gt;
&lt;p&gt;Pero también tiene implicaciones en el diseño de nuestro software. Usar demasiados parámetros puede ser un indicativo de que estamos &lt;strong&gt;violando el principio de responsabilidad única&lt;/strong&gt; (SRP, por sus siglas en inglés), lo que significa que está haciendo demasiadas cosas a la vez y debería ser dividido en métodos más pequeños y específicos. Podría indicar igualmente una &lt;strong&gt;baja cohesión&lt;/strong&gt;, porque es posible que los parámetros no estén relacionados entre sí y el ámbito del método sea demasiado amplio.&lt;/p&gt;
&lt;h2&gt;Pero, ¿cuántos parámetros son demasiados?&lt;/h2&gt;
&lt;p&gt;Como comentaba algo más arriba, no existe una respuesta única y definitiva a esta pregunta, pero sí hay algunas recomendaciones generales que pueden servirnos de guía.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://es.wikipedia.org/wiki/Robert_C._Martin&quot;&gt;Robert C. Martin&lt;/a&gt;, también conocido como &quot;Uncle Bob&quot;, sugiere que &lt;strong&gt;el número ideal de parámetros es cero&lt;/strong&gt;. Está claro, si un método no recibe ningún parámetro, no dependerá de ningún dato externo, por lo que no existirá código de validación, ni transformaciones de datos, ni la lógica dependerá de ellos. En definitiva, el método será más simple y directo y, a lo sumo, podrá operar con datos internos de su objeto o valores constantes; el código será más conciso, fácil de leer y entender. Todo ventajas 😉&lt;/p&gt;
&lt;p&gt;Sin embargo, en el mundo real es un objetivo difícil de alcanzar, por lo que en la mayoría de escenarios, que nuestros métodos o funciones no tengan parámetros es más una aspiración teórica que otra cosa.&lt;/p&gt;
&lt;p&gt;A partir de ese límite ideal, está claro que conforme va creciendo el número de parámetros, la complejidad del método también aumenta, y con ella la dificultad para entenderlo y mantenerlo. En su clásico libro &lt;a href=&quot;https://archive.org/details/cleancodehandboo0000unse&quot;&gt;Clean Code&lt;/a&gt;, Martin dice que &lt;strong&gt;usar más de tres parámetros debería requerir una justificación bien argumentada&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En general, la comunidad de desarrolladores está más o menos de acuerdo en que &lt;strong&gt;el ideal es que un método o función no reciba más de 3 o 4 parámetros&lt;/strong&gt;. A partir de ahí, el código comienza a ser difícil de leer y mantener y es cuando se empieza a considerar que estamos ante un &quot;code smell&quot; que puede traernos problemas.&lt;/p&gt;
&lt;p&gt;Steve McConnell, en su libro &quot;Code Complete&quot;, establece que &lt;strong&gt;el máximo número de parámetros debería rondar los siete&lt;/strong&gt;, basándose en el número mágico de la psicología cognitiva, propuesto por George A. Miller en 1956, que sugiere que el número de elementos que una persona puede retener en su memoria a corto plazo es de aproximadamente siete (más o menos dos).&lt;/p&gt;
&lt;p&gt;Por tanto, la cosa queda así:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Número de parámetros&lt;/th&gt;
&lt;th&gt;Comentario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Ideal, aunque poco probable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-3&lt;/td&gt;
&lt;td&gt;Bien, fácil de entender y mantener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-7&lt;/td&gt;
&lt;td&gt;Sólo en casos justificados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8+&lt;/td&gt;
&lt;td&gt;❌ Evitar a toda costa&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pero ojo, porque, como siempre, existen casos que pueden romper estas reglas generales. Un ejemplo clásico podría ser una función como la siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public int SumNineNumbers(
    int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9) 
{
    return n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si su misión es realizar una acción concreta que requiere un determinado número de valores de entrada, ¿sería incorrecto definirla con nueve parámetros? ¿O es lo que esperaríamos, dado el nombre de la propia función? En mi opinión, en este caso estaría totalmente justificado; cualquier refactorización para reducir el número de parámetros sería introducir una complejidad innecesaria.&lt;/p&gt;
&lt;h2&gt;¿Y qué alternativas tenemos?&lt;/h2&gt;
&lt;p&gt;Cuando ya estamos ante un método o función que define o va a definir demasiados parámetros, es importante detenernos a pensar cómo podemos mejorarlo.&lt;/p&gt;
&lt;p&gt;En primer lugar, debemos &lt;strong&gt;preguntarnos por qué nuestro código necesita tantos datos de entrada&lt;/strong&gt;. ¿Estamos haciendo quizás demasiadas cosas en el mismo método? ¿Tiene demasiadas dependencias? Si es así, es posible que estemos violando el principio de responsabilidad única (SRP) y deberíamos considerar dividirlo en varios más pequeños y específicos.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Refactorizar esto:
public void ProcessAndNotifyOrder(
    string orderId, string customerName, DateTime orderDate, 
    string notificationEmail, string notificationMessage)
{
    // Lógica para procesar el pedido
    // Lógica para notificar al cliente
}

// A esto:
public void ProcessOrder(string orderId, string customerName, DateTime orderDate)
{
    // Lógica para procesar el pedido
}
public void NotifyCustomer(string notificationEmail, string notificationMessage)
{
    // Lógica para notificar al cliente
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero si realmente necesitamos recibir todos esos argumentos, existen distintas técnicas que pueden ayudarnos a reducir el número de parámetros y evitar problemas.&lt;/p&gt;
&lt;p&gt;Por ejemplo, &lt;strong&gt;si estamos recibiendo siempre el resultado de haber usado un método, función o propiedad, quizás esa llamada debería realizarse desde dentro de nuestro propio código&lt;/strong&gt;, como se muestra a continuación:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Refactorizar esto:
public void Log(string message, string level, string source, DateTime now)
{
    // Lógica para registrar el mensaje
}

// A esto:
public void Log(string message, string level, string source)
{
    DateTime now = DateTime.Now; // Obtenemos el timestamp dentro del método
    // Lógica para registrar el mensaje
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;También, &lt;strong&gt;si nuestro método o función recibe parámetros booleanos, deberíamos considerar revisarlo&lt;/strong&gt;. Como vimos hace tiempo en el post &quot;&lt;a href=&quot;https://www.variablenotfound.com/2022/03/usar-booleanos-si-no-veces.html&quot;&gt;¿Usar booleanos? ¿Sí, no, a veces?&lt;/a&gt;&quot;, este tipo de parámetros suele introducir ambigüedad y confusión, ya que no siempre está claro qué significa cada valor. En su lugar, quizás podríamos usar dos funciones diferentes, cada una con un propósito claro y específico:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Refactorizar esto:
public void Log(string message, string level, string source, bool isError)
{
    // Lógica para registrar el mensaje
}

// A esto:
public void LogInfo(string message, string level, string source)
{
    // Lógica para registrar el mensaje
}
public void LogError(string message, string level, string source)
{
    // Lógica para registrar el mensaje
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otra posibilidad, que seguro habréis visto con cierta frecuencia, es el caso de métodos que reciben argumentos procedentes de un mismo objeto. En estos casos, podríamos considerar &lt;b&gt;recibir el objeto completo&lt;/b&gt; en lugar de sus propiedades individuales:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// Refactorizar esto:
public void ProcessOrder(
    string orderId, string customerName, string customerEmail, DateTime orderDate)
{
    // Lógica para procesar el pedido
}

// A esto:
public void ProcessOrder(Order order)
{
    // Lógica para procesar el pedido
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otra solución bastante habitual es &lt;strong&gt;usar la refactorización conocida como &lt;a href=&quot;https://refactoring.com/catalog/introduceParameterObject.html&quot;&gt;Introduce Parameter Object&lt;/a&gt;&lt;/strong&gt;. Esta técnica consiste en agrupar varios parámetros relacionados en un único objeto, lo que reduce el número de parámetros y mejora la legibilidad del código.&lt;/p&gt;
&lt;p&gt;Por ejemplo, podemos ver el resultado de aplicar esta técnica en el siguiente código:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// Refactorizar esto:
public Task&amp;lt;IEnumerable&amp;lt;Customer&amp;gt;&amp;gt; GetCustomersAsync(
    int pageNumber, int pageSize, string sortBy, string filter, bool includeInactive)
{
    // Lógica para obtener los clientes
}

// A esto:
public Task&amp;lt;IEnumerable&amp;lt;Customer&amp;gt;&amp;gt; GetCustomersAsync(CustomerQuery query)
{
    // Lógica para obtener los clientes
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aparte, si el objeto de parámetros es muy complejo, puede ser útil &lt;strong&gt;combinar este enfoque con el &lt;a href=&quot;https://es.wikipedia.org/wiki/Builder_(patr%C3%B3n_de_dise%C3%B1o)&quot;&gt;patrón Builder&lt;/a&gt;&lt;/strong&gt;, que permite construirlo paso a paso. Por ejemplo, podríamos tener un código como el siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// Refactorizar esto:
var query = new CustomerQuery
{
    PageNumber = 1,
    PageSize = 20,
    SortBy = &quot;Name&quot;,
    IncludeInactive = false,
    IncludeOrders = false,
    IncludeAddresses = true
};
var customers = await GetCustomersAsync(query);

// A esto:
var query = new CustomerQueryBuilder()
    .WithPageNumber(1)
    .WithPageSize(20)
    .SortedByName()
    .IncludeAddresses()
    .Build();
var customers = await GetCustomersAsync(query);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¡Espero que os haya resultado interesante!&lt;/p&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/3590103656004345361/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/3590103656004345361' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3590103656004345361'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3590103656004345361'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/cuantos-parametros-son-demasiados.html' title='¿Cuántos parámetros son demasiados parámetros?'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscTryQJPQkC0QmeHY4bGVET8KVC_tTGz6DGOopBe_uCjobAUKVLNtKyNS1_Ivz2adncBWJSxIYq-kFmHvKl-dKT28Jpes9L75iipisLhEZPR9lEy4jyNsRFIhfiGFb2-06NXa_OmXTfmhvhMIk-vvnuXBhEsDNfsEmy4YfEH-Pt_76Ck5psHViw/s72-c/cuantos-parametros.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7749817062724807075</id><published>2026-02-02T08:05:00.029+01:00</published><updated>2026-02-02T08:05:00.145+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 635</title><content type='html'>&lt;img alt=&quot;Enlaces interesantes&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioNKKwlH_UIMUUYydoGKsLjD1BdHD07ynUL_zws2V6tU2WnCTm4oNjqhLMyb3FFC2r51vRwTbh38sWICFyeMFVeatWdh2Lt9AEPrnBnRX_g9_7lcQ3QWuk8qZaYwg1siwVkKKIAFXjK-iLwbl4WTS9WZfvioNnPqYAuWEwB_hucOhfJ7xSVbMxVQ/s800/gurus.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Aquí tenemos la colección de enlaces a contenidos interesantes que he recopilado a lo largo de la semana pasada 🙂&lt;/p&gt;
&lt;p&gt;En esta ocasión, me gustaría destacar el artículo de Jose Manuel Alarcón sobre la charla de Demis Hassabis y Dario Amodei, CEOs de Google DeepMind y Anthropic respectivamente, en el Foro Económico Mundial de Davos 2026, donde hablaron sobre &lt;a href=&quot;https://www.campusmvp.es/recursos/post/Hassabis-Amodei-Davos-2026.aspx&quot; target=&quot;_blank&quot;&gt;la llegada de la AGI y su impacto en el desarrollo de software y otras áreas&lt;/a&gt;. Muy interesante.&lt;/p&gt;
&lt;p&gt;Continuando con gurús, Anders Hejlsberg, el arquitecto detrás de C# y TypeScript, compartió en una entrevista reciente algunas &lt;a href=&quot;https://github.blog/developer-skills/programming-languages-and-frameworks/7-learnings-from-anders-hejlsberg-the-architect-behind-c-and-typescript/&quot; target=&quot;_blank&quot;&gt;lecciones aprendidas a lo largo de su carrera&lt;/a&gt;: retroalimentación temprana, renunciar a preferencias personales, colaboración abierta y muchas otras.&lt;/p&gt;
&lt;p&gt;También vale la pena echar un vistazo al post de Braulio Díez, donde describe la  a la que se enfrentan a diario las personas que deciden emprender en el mundo tecnológico, ya sea como autónomos o como empresa. Y es que, muy a menudo, desde fuera solo vemos &lt;a href=&quot;https://elbraulio.net/posts/la-punta-del-iceberg&quot; target=&quot;_blank&quot;&gt;la punta del iceberg&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Volviendo a terrenos más técnicos, encontramos un artículo de Grant Riordan sobre &lt;a href=&quot;https://www.freecodecamp.org/news/how-to-implement-type-safe-unions-in-c-with-oneof/&quot; target=&quot;_blank&quot;&gt;cómo implementar uniones de tipos seguros en C#&lt;/a&gt; utilizando la biblioteca OneOf. Muy útil para quienes buscan mejorar la seguridad de tipos en sus aplicaciones.&lt;/p&gt;
&lt;p&gt;Y muy interesante también &lt;a href=&quot;https://github.com/CodingWithCalvin/VS-ProjectRenamifier&quot; target=&quot;_blank&quot;&gt;la extensión Renamifier para Visual Studio&lt;/a&gt;, creada por Calvin Allen, que permite renombrar proyectos de forma segura, evitando las tareas manuales y problemas habituales asociados con este proceso.&lt;/p&gt;
&lt;p&gt;El resto de artículos, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/02/la-interfaz-imiddleware-middlewares.html&quot;&gt;La interfaz IMiddleware: Middlewares tipados per request en ASP.NET Core&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/11/los-nuevos-metodos-linq-en-net-9.html&quot;&gt;Los nuevos métodos LINQ en .NET 9: CountBy(), AggregateBy() e Index()&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/missed-these-12-csharp-features&quot;&gt;Missed these 12 new C# features?&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/how-to-implement-type-safe-unions-in-c-with-oneof/&quot;&gt;How to Implement Type Safe Unions in C# With OneOf&lt;/a&gt;&lt;br /&gt;
Grant Riordan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/01/passing-parameters-to-hosted-mcp-server.html&quot;&gt;Passing parameters to a hosted MCP Server in C#&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/creating-and-consuming-metrics-with-system-diagnostics-metrics-apis/&quot;&gt;Creating and consuming metrics with System.Diagnostics.Metrics APIs&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/microsoft-agent-framework-preview-ai&quot;&gt;Microsoft Agent Framework (Preview): AI Agent Development for .NET&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opensilver.net/announcements/3-3/&quot;&gt;Introducing OpenSilver 3.3: Blazor Components Now Run Directly Inside XAML Applications&lt;/a&gt;&lt;br /&gt;
OpenSilver Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-ai-essentials-the-core-building-blocks-explained/&quot;&gt;.NET AI Essentials - The Core Building Blocks Explained&lt;/a&gt;&lt;br /&gt;
Jeremy Likness&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/01/28/building-an-mcp-app-with-c-a-color-picker-sample/&quot;&gt;Building an MCP App with C# – A Color Picker Sample&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/dotnet/modern-internationalization-patterns-for-dotnet/&quot;&gt;Internationalization Architecture for Global .NET Applications&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.stevejgordon.co.uk/the-grand-mystery-of-the-missing-18-bytes&quot;&gt;The Grand Mystery of the Missing 18 Bytes&lt;/a&gt;&lt;br /&gt;
Steve Gordon&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/01/26/force-step-up-authentication-in-web-applications/&quot;&gt;Force step up authentication in web&amp;nbsp;applications&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/access-control-aspnet-core/&quot;&gt;Your [Authorize] Attribute Is Compliance Theater&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorise.com/blog/building-a-design-system-on-top-of-blazorise&quot;&gt;Building a Design System on Top of Blazorise&lt;/a&gt;&lt;br /&gt;
Mladen Macanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/new-in-net-10-and-c-14-multi-tenant-rate-limiting/&quot;&gt;New in .NET 10 and C# 14: Multi-Tenant Rate Limiting&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/getting-started-blazor-diagram-component&quot;&gt;Getting Started with the Blazor Diagram Component&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/audit-logging-azure-app-insights/&quot;&gt;Audit Logging That Survives Your Next Security Incident&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timdeschryver.dev/blog/changing-how-aspnet-generates-openapi-schema-names&quot;&gt;Changing how ASP.NET generates OpenAPI schema names&lt;/a&gt;&lt;br /&gt;
Tim Deschryver&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.darifer.net/index.php/2026/01/25/que-novedades-nos-trae-azure-local-2601/&quot;&gt;¿Qué novedades nos trae Azure Local 2601?&lt;/a&gt;&lt;br /&gt;
David Rivera&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/01/dotnet-10-available-for-aws/&quot;&gt;.NET 10 Becomes Available on AWS Lambda as Managed Runtime and Base Image&lt;/a&gt;&lt;br /&gt;
Almir Vuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/appsonazureblog/minimum-usage-in-azure-app-testing/4490658&quot;&gt;Minimum Usage in Azure App Testing&lt;/a&gt;&lt;br /&gt;
Nikita Nallamothu&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/engineering/from-pixels-to-characters-the-engineering-behind-github-copilot-clis-animated-ascii-banner/&quot;&gt;From pixels to characters: The engineering behind GitHub Copilot CLI’s animated ASCII banner&lt;/a&gt;&lt;br /&gt;
Aaron Winston&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/best-practices-creating-user-friendly-data-grids&quot;&gt;Best Practices for Creating User-Friendly Data Grids&lt;/a&gt;&lt;br /&gt;
Suzanne Scacca&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/patterns-of-distributed-systems-in-c-and-net-a-new-series-for-people-who-ship-real-systems/&quot;&gt;Patterns of Distributed Systems in C# and .NET: A New Series for People Who Ship Real Systems&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/why-every-ef-core-developer-needs-to-try-entity-framework-extensions&quot;&gt;Why Every EF Core Developer Needs to Try Entity Framework Extensions&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/database/modernizing-stored-procedures-for-net-architects/&quot;&gt;Modernizing Stored Procedure-Heavy Applications: When to Move Logic to .NET&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://erikej.github.io/dotnet/dacfx/sqlserver/visualstudio/2026/01/29/sqlproj-power-tools-guide.html&quot;&gt;Getting Started with SQL Database Project Power Tools&lt;/a&gt;&lt;br /&gt;
Erik Ejlskov Jensen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/Hassabis-Amodei-Davos-2026.aspx&quot;&gt;Hassabis-Amodei en Davos 2026: El día después de la AGI y su impacto en el desarrollado de software&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/01/cyphering-prompts-para-evadir.html&quot;&gt;Cyphering Prompts &amp;amp; Answers para evadir Guardarraíles&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/educatordeveloperblog/the-hidden-memory-architecture-of-llms/4485367&quot;&gt;The Hidden Memory Architecture of LLMs&lt;/a&gt;&lt;br /&gt;
Hazem Ali&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://david-gilbertson.medium.com/shrinking-a-language-detection-model-to-under-10-kb-b729bc25fd28&quot;&gt;Shrinking a language detection model to under 10 KB&lt;/a&gt;&lt;br /&gt;
David Gilbertson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/01/google-translategemma-models/&quot;&gt;Google Introduces TranslateGemma Open Models for Multilingual Translation&lt;/a&gt;&lt;br /&gt;
Daniel Domínguez&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/there-is-no-need-to-trap-focus-on-a-dialog-element/&quot;&gt;There is No Need to Trap Focus on a Dialog Element&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/01/unstacking-css-stacking-contexts/&quot;&gt;Unstacking CSS Stacking Contexts&lt;/a&gt;&lt;br /&gt;
Gabriel Shoyombo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/how-to-style-the-new-search-text-and-other-highlight-pseudo-elements/&quot;&gt;How to Style the New ::search-text and Other Highlight-y Pseudo-Elements&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/vue-basics-ultimate-guide-vue-3-reactivity&quot;&gt;Vue Basics: Ultimate Guide to Vue 3 Reactivity&lt;/a&gt;&lt;br /&gt;
David Adeneye Abiodun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/relicss/&quot;&gt;ReliCSS&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://howbrowserswork.com/&quot;&gt;How Browsers Work&lt;/a&gt;&lt;br /&gt;
Dmytro Krasun&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/01/como-generar-changelogs-automaticos-para-tus-releases-en-github/&quot;&gt;Cómo generar changelogs automáticos para tus releases en GitHub&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/01/testing-your-mcp-server-with-visual.html&quot;&gt;Testing your MCP server with Visual Studio HTTP Files&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-january-update-enhanced-editor-experience/&quot;&gt;Visual Studio January Update&lt;/a&gt;&lt;br /&gt;
Simona Liao&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sonnes.cloud/visual-studio-enterprise-partner-benefits-a-heads-up/&quot;&gt;Visual Studio Enterprise Partner Benefits – a Heads-Up!&lt;/a&gt;&lt;br /&gt;
Michael Morten Sonne&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/dotnet/2026/01/29/resharper-and-rider-2025-3-2/&quot;&gt;ReSharper and Rider 2025.3.2 Updates Out Now!&lt;/a&gt;&lt;br /&gt;
Anna Ruban&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/CodingWithCalvin/VS-ProjectRenamifier&quot;&gt;ProjectRenamifier: A Visual Studio extension that allows you to safely rename a project&lt;/a&gt;&lt;br /&gt;
Calvin Allen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI / Cross-platform&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.uno/blog/welcoming-web-content-to-native-apps/&quot;&gt;Welcoming Web Content to Native Apps&lt;/a&gt;&lt;br /&gt;
Sam Basu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/6-net-maui-properties-you-didnt-know-work-buttons&quot;&gt;6 .NET MAUI Properties You Didn’t Know Work with Buttons&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://elbraulio.net/posts/la-punta-del-iceberg&quot;&gt;La punta del Iceberg&lt;/a&gt;&lt;br /&gt;
Braulio Díez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/developer-skills/programming-languages-and-frameworks/7-learnings-from-anders-hejlsberg-the-architect-behind-c-and-typescript/&quot;&gt;7 learnings from Anders Hejlsberg: The architect behind C# and TypeScript&lt;/a&gt;&lt;br /&gt;
Aaron Winston&lt;/li&gt;&lt;/ul&gt;



Publicado en: &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;www.variablenotfound.com&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7749817062724807075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7749817062724807075' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7749817062724807075'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7749817062724807075'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/02/enlaces-interesantes-635.html' title='Enlaces interesantes 635'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioNKKwlH_UIMUUYydoGKsLjD1BdHD07ynUL_zws2V6tU2WnCTm4oNjqhLMyb3FFC2r51vRwTbh38sWICFyeMFVeatWdh2Lt9AEPrnBnRX_g9_7lcQ3QWuk8qZaYwg1siwVkKKIAFXjK-iLwbl4WTS9WZfvioNnPqYAuWEwB_hucOhfJ7xSVbMxVQ/s72-c/gurus.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-3182818175454911325</id><published>2026-01-26T08:05:00.032+01:00</published><updated>2026-01-29T08:31:04.034+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 634</title><content type='html'>&lt;img alt=&quot;Sala de servidores de Cloudflare analizando el tráfico de Internet&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJS38_oN1MYACzHIhJGlUz_UaEZL0EWIdPFkMEsmM-xttBn3zmerEVnKYgtrEEgEP_mZsJmQVRbiuJerxwukR8_LSbWmHrtXkiyJlFNHFPgLbRypOa-0PoV8GnE2pCLOdtp66-_pweUxCy6nV6XYiDAFa1i1FwfY1bmUTM5J6_OqM7pMEkTaRDXg/s825/internet.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;La entrega semanal de los enlaces interesantes ya está disponible, con cerca de cincuenta referencias a contenidos a los que creo que merece la pena echar un vistazo.&lt;/p&gt;
&lt;p&gt;Y por destacar, en primer lugar, &lt;a href=&quot;https://elbraulio.net/posts/lo-que-diga-claudia&quot; target=&quot;_blank&quot;&gt;la interesante reflexión de Braulio Díez sobre las nuevas posibilidades y peligros que ofrece la IA generativa&lt;/a&gt; en el ámbito de la programación, y algunas predicciones sobre lo que veremos en 2026 a este respecto.&lt;/p&gt;
&lt;p&gt;La invalidación de una caché distribuida es un problema complejo. Milan Jovanović nos explica &lt;a href=&quot;https://www.milanjovanovic.tech/blog/solving-the-distributed-cache-invalidation-problem-with-redis-and-hybridcache&quot; target=&quot;_blank&quot;&gt;cómo solucionarlo usando Redis e HybridCache&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Davide Bellone abre un &lt;a href=&quot;https://www.code4it.dev/blog/code-opinion-async-suffix/&quot; target=&quot;_blank&quot;&gt;interesante debate sobre la necesidad (o no) de usar el sufijo Async en los métodos asíncronos de C#&lt;/a&gt;. Yo soy de Async, ¿y tú?&lt;/p&gt;
&lt;p&gt;También vale mucho la pena dedicar un ratillo a leer el informe de Cloudflare &lt;a href=&quot;https://radar.cloudflare.com/year-in-review/2025&quot; target=&quot;_blank&quot;&gt;2025 Year in Review&lt;/a&gt;, donde, desde su privilegiada posición, analizan lo que ven pasar por sus redes. Spoiler: mucho tráfico, mucha IA, mucho ataque DDoS, incremento de uso de encriptación post-cuántica, etc.&lt;/p&gt;
&lt;p&gt;Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/11/mejora-el-rendimiento-de-hybridcache.html&quot;&gt;Mejora el rendimiento de HybridCache mediante la reutilización de objetos&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/01/el-hosting-in-process-de-aspnet-core-22.html&quot;&gt;El hosting in-process de ASP.NET Core&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anthonygiretti.com/2026/01/19/net-10-zip-and-gzip-api-improvements/&quot;&gt;.NET 10: Zip and GZip API Improvements&lt;/a&gt;&lt;br /&gt;
Anthony Giretti&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/solving-the-distributed-cache-invalidation-problem-with-redis-and-hybridcache&quot;&gt;Solving the Distributed Cache Invalidation Problem with Redis and HybridCache&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anthonygiretti.com/2026/01/19/net-10-post-quantum-cryptography-comes-to-net/&quot;&gt;.NET 10: Post-Quantum Cryptography Comes to .NET&lt;/a&gt;&lt;br /&gt;
Anthony Giretti&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://henriquesd.medium.com/net-10-and-c-14-unbound-generic-types-and-nameof-b6b64ae1eb9a&quot;&gt;.NET 10 and C# 14 — Unbound generic types and nameof&lt;/a&gt;&lt;br /&gt;
Henrique Siebert Domareski&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/making-foreach-on-an-ienumerable-allocation-free-using-reflection-and-dynamic-methods/&quot;&gt;Making foreach on an IEnumerable allocation-free using reflection and dynamic methods&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/10-reasons-to-upgrade-to-dotnet-10&quot;&gt;10 Reasons to Upgrade to .NET 10&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.code4it.dev/blog/code-opinion-async-suffix/&quot;&gt;Code opinion: why I prefer avoiding the Async suffix in C# asynchronous methods&lt;/a&gt;&lt;br /&gt;
Davide Bellone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/new-in-net-10-and-c-14-fast-model-validation-for-apis/&quot;&gt;New in .NET 10 and C# 14: Fast Model Validation for APIs&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/iso-standards-intro-dotnet-developers/&quot;&gt;Why ISO Standards Actually Matter for .NET Developers&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://saas101.tech/modern-authentication-in-2026-how-to-secure-your-net-8-and-angular-apps-with-keycloak/&quot;&gt;Modern Authentication in 2026: How to Secure Your .NET 8 and Angular Apps with Keycloak&lt;/a&gt;&lt;br /&gt;
UnknownX&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/01/18/implementing-level-of-identification-loi-with-asp-net-core-identity-and-duende/&quot;&gt;Implementing Level of Identification (LoI) with ASP.NET Core Identity and&amp;nbsp;Duende&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/enterprise-patterns-for-asp-net-core-minimal-api-data-transfer-object-pattern/&quot;&gt;Enterprise Patterns for ASP.NET Core Minimal API: Data Transfer Object Pattern&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/five-minimal-api-myths-and-real-truth&quot;&gt;5 Minimal API myths and the real truth&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/dotnet/scalable_webhook_delivery_security_asp_net_core/&quot;&gt;Building Webhooks in ASP.NET Core: Delivery Guarantees, Retries, Security, and Scalable Architecture&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/getting-started-blazor-skeleton-component&quot;&gt;Getting Started with the Blazor Skeleton Component&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorise.com/blog/responsive-layout-strategies-using-blazorise-grid-and-breakpoints&quot;&gt;Responsive Layout Strategies Using Blazorise Grid &amp;amp; Breakpoints&lt;/a&gt;&lt;br /&gt;
Mladen Macanović&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/you-cant-future-proof-software-architecture/&quot;&gt;You Can’t Future-Proof Software Architecture&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azuredbsupport/using-clientconnectionid-to-correlate-net-connection-attempts-in-azure-sql/4477124&quot;&gt;Using ClientConnectionId to Correlate .NET Connection Attempts in Azure SQL&lt;/a&gt;&lt;br /&gt;
Kalyan Singh Bondili&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/announcing-github-copilot-code-completions-in-sql-server-management-22-2-1/4488252&quot;&gt;Announcing GitHub Copilot code completions in SQL Server Management 22.2.1&lt;/a&gt;&lt;br /&gt;
Erin Stellato&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://elbraulio.net/posts/lo-que-diga-claudia&quot;&gt;Lo que diga Claudia&lt;/a&gt;&lt;br /&gt;
Braulio Díez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11586/generative-ai-attention-mechanism/&quot;&gt;Introduction to Generative AI: Attention Mechanism&lt;/a&gt;&lt;br /&gt;
Harris Amjad&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://instatunnel.my/blog/the-wasm-breach-escaping-backend-webassembly-sandboxes&quot;&gt;The Wasm Breach: Escaping Backend WebAssembly Sandboxes&lt;/a&gt;&lt;br /&gt;
InstaTunnel Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/whats-new-in-next-js-16-turbo-builds-smart-caching-ai-debugging&quot;&gt;What&#39;s new in Next.js 16: Turbo Builds, Smart Caching, AI Debugging&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.uno/blog/the-state-of-webassembly-2025-2026/&quot;&gt;The State of WebAssembly – 2025 and 2026&lt;/a&gt;&lt;br /&gt;
Gerard Gallant&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/i-learned-the-first-rule-of-aria-the-hard-way/&quot;&gt;I Learned The First Rule of ARIA the Hard Way&lt;/a&gt;&lt;br /&gt;
Hashim Quraishi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/how-execution-context-works-in-javascript-handbook/&quot;&gt;How Execution Context Works in JavaScript – A Handbook for Devs&lt;/a&gt;&lt;br /&gt;
Sumit Saha&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/javascript-pdf-library-2025-volume-4-release&quot;&gt;Create, Edit, and Sign PDFs in JavaScript - No Backend Required&lt;/a&gt;&lt;br /&gt;
Anand Panchamoorthi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2026/CR-webnn-20260122/&quot;&gt;Updated Candidate Recommendation: Web Neural Network (WebNN) API&lt;/a&gt;&lt;br /&gt;
W3C&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/css-in-2026/&quot;&gt;CSS in 2026: The new features reshaping frontend development&lt;/a&gt;&lt;br /&gt;
Jemima Abu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/responsive-hexagon-grid-using-modern-css/&quot;&gt;Responsive Hexagon Grid Using Modern CSS&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/17758/when-will-css-grid-lanes-arrive-how-long-until-we-can-use-it/&quot;&gt;When will CSS Grid Lanes arrive? How long until we can use it?&lt;/a&gt;&lt;br /&gt;
Jen Simmons&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mike-irving.co.uk/web-design-blog/?blogid=133&quot;&gt;.NET 10 support in Visual Studio 2022&lt;/a&gt;&lt;br /&gt;
Mike Irving&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codingwithcalvin.net/introducing-git-ranger-extension/&quot;&gt;Introducing the &#39;Git Ranger&#39; Visual Studio extension!&lt;/a&gt;&lt;br /&gt;
Calvin Allen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/01/20/top-5-ai-tools-for-visual-studio-2026.aspx&quot;&gt;Top 5 AI Tools for Visual Studio 2026&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/cppblog/now-in-public-preview-github-copilot-build-performance-for-windows/&quot;&gt;Now in Public Preview: GitHub Copilot build performance for Windows&lt;/a&gt;&lt;br /&gt;
David Li&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jesseliberty.com/2026/01/22/essential-programmer-utilities/&quot;&gt;Essential Programmer Utilities&lt;/a&gt;&lt;br /&gt;
Jesse Liberty&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.poppastring.com/blog/colordriven-code-navigation&quot;&gt;Color‑Driven Code Navigation&lt;/a&gt;&lt;br /&gt;
Mark Downie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/bringing-work-context-to-your-code-in-github-copilot&quot;&gt;Bringing work context to your code in GitHub Copilot&lt;/a&gt;&lt;br /&gt;
Kayla Cinnamon&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/ai/2026/01/codex-in-jetbrains-ides/&quot;&gt;Codex Is Now Integrated Into JetBrains IDEs&lt;/a&gt;&lt;br /&gt;
Anton Semenkin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-agent-kit-ai-coding-assistants/&quot;&gt;Introducing the Azure Cosmos DB Agent Kit: Your AI Pair Programmer Just Got Smarter&lt;/a&gt;&lt;br /&gt;
Sajeetharan Sinnathurai&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/multi-step-wizard-dotnet-maui-tab-view&quot;&gt;Building a Gated Multi-Step Wizard in .NET MAUI with Tab View&lt;/a&gt;&lt;br /&gt;
Sneha Kumar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/adding-external-fonts-net-maui&quot;&gt;Adding External Fonts in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260119-06/?p=111995&quot;&gt;What was the secret sauce that allows for a faster restart of Windows 95 if you hold the shift key?&lt;/a&gt;&lt;br /&gt;
Raymond Chen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/year-in-review/2025#post-quantum-encryption&quot;&gt;Cloudflare Radar 2025 Year in Review&lt;/a&gt;&lt;br /&gt;
Cloudflare&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/3182818175454911325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/3182818175454911325' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3182818175454911325'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3182818175454911325'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/01/enlaces-interesantes-634.html' title='Enlaces interesantes 634'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJS38_oN1MYACzHIhJGlUz_UaEZL0EWIdPFkMEsmM-xttBn3zmerEVnKYgtrEEgEP_mZsJmQVRbiuJerxwukR8_LSbWmHrtXkiyJlFNHFPgLbRypOa-0PoV8GnE2pCLOdtp66-_pweUxCy6nV6XYiDAFa1i1FwfY1bmUTM5J6_OqM7pMEkTaRDXg/s72-c/internet.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-4226690196518028022</id><published>2026-01-20T08:05:00.002+01:00</published><updated>2026-01-20T08:05:00.119+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><title type='text'>Usar factorías para devolver la misma instancia desde el contenedor de servicios de .NET</title><content type='html'>&lt;img alt=&quot;Desarrollador inyectando componentes en un sistema&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz6fcGWm3Krvoxg2G04FtJAbnMNeVSYhRN61SqLzv_yHBF0x_f6geEv42ndwt04nEaBEW0D2u3_ecQERet9LmChxuLDIZMwjveB6bPgA3W5ybxRmJshZUUrD6gwnHwJH9cZmHAMh30UnjDaMkgmU_UbtO-X99sScZ43VOAHOw9xDgFk46it1AM6w/s800/factorias.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Normalmente, cuando registramos un servicio en el inyector de dependencias de .NET, lo hacemos una única vez. A veces registramos directamente el servicio, aunque lo habitual es que lo asociemos a una interfaz, de forma que en futuro podamos sustituir la implementación sin tener que cambiar el resto del código:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Registramos el servicio asociado a una interfaz:
builder.Services.AddScoped&amp;lt;IInvoiceIssuer, InvoiceServices&amp;gt;();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sin embargo, nada impide que el mismo servicio lo registremos varias veces asociándolo a distintas abstracciones, sobre todo si tenemos nuestras clases de servicio son muy extensas y estamos haciendo &lt;a href=&quot;https://es.wikipedia.org/wiki/Principio_de_segregaci%C3%B3n_de_la_interfaz&quot;&gt;segregación de interfaces&lt;/a&gt; (la &quot;I&quot; de los principios &lt;a href=&quot;https://es.wikipedia.org/wiki/SOLID&quot;&gt;SOLID&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Registramos el servicio asociado a varias interfaces, de forma
// que en otros servicios sólo será necesario inyectar la interfaz 
// concreta que necesitemos:
builder.Services.AddScoped&amp;lt;IInvoiceIssuer, InvoiceServices&amp;gt;();
builder.Services.AddScoped&amp;lt;IInvoiceSender, InvoiceServices&amp;gt;();
builder.Services.AddScoped&amp;lt;IInvoicePrinter, InvoiceServices&amp;gt;();
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero fijaos que &lt;strong&gt;esto está introduciendo un sutil problema&lt;/strong&gt;: cada vez que se inyecte una de estas interfaces, se creará una nueva instancia de &lt;code&gt;InvoiceServices&lt;/code&gt;, lo cual, además de consumir más recursos, puede ser un problema si a su vez el servicio depende de otros componentes que no puedan o deban ser compartidos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public class DoSomething
{
    public DoSomething(IInvoiceIssuer issuer, IInvoiceSender sender, IInvoicePrinter printer)
    {
        // Aquí se habrán creado tres instancias de InvoiceServices
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¿Cómo podemos solucionarlo?&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Para estos casos, podemos usar el parámetro &lt;code&gt;implementationFactory&lt;/code&gt; que encontramos en los métodos &lt;code&gt;AddScoped()&lt;/code&gt;, &lt;code&gt;AddSingleton()&lt;/code&gt; y &lt;code&gt;AddTransient()&lt;/code&gt; de &lt;code&gt;IServiceCollection&lt;/code&gt;. Este parámetro es un delegado que podemos usar para crear la instancia a retornar cuando se requiera un objeto del tipo solicitado. Pero lo más interesante es que, dado que recibe como parámetro una referencia al proveedor de servicios, podemos utilizarlo para obtener la instancia de otro servicio ya registrado:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;builder.Services.AddScoped&amp;lt;IInvoiceIssuer, InvoiceServices&amp;gt;(
    services =&amp;gt; 
    {
        // Usamos &quot;services&quot; para obtener el servicio ya registrado,
        //  en vez de instanciar uno nuevo cada vez
        ...
    }   
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En nuestro caso, podríamos registrar el servicio &lt;code&gt;InvoiceServices&lt;/code&gt; una única vez de forma genérica, definiendo su tiempo de vida (&lt;em&gt;singleton&lt;/em&gt;, &lt;em&gt;scoped&lt;/em&gt;, &lt;em&gt;transient&lt;/em&gt;) y sin asociarlo a ninguna interfaz concreta. Luego, a la hora de registrar las distintas abstracciones, usar el proveedor de servicios para obtener una instancia del tipo registrado:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Registramos el servicio una única vez:
builder.Services.AddScoped&amp;lt;InvoiceServices&amp;gt;();

// A continuación, usamos para cada interfaz la factoría, 
// que retorna la instancia del servicio registrado:
builder.Services.AddScoped&amp;lt;IInvoiceIssuer, InvoiceServices&amp;gt;(
    services =&amp;gt; services.GetRequiredService&amp;lt;InvoiceServices&amp;gt;()
);

builder.Services.AddScoped&amp;lt;IInvoiceSender, InvoiceServices&amp;gt;(
    services =&amp;gt; services.GetRequiredService&amp;lt;InvoiceServices&amp;gt;()
);

builder.Services.AddScoped&amp;lt;IInvoicePrinter, InvoiceServices&amp;gt;(
    services =&amp;gt; services.GetRequiredService&amp;lt;InvoiceServices&amp;gt;()
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obviamente, si se crean o no instancias nuevas de &lt;code&gt;InvoiceServices&lt;/code&gt; dependerá de cómo se haya registrado este servicio en el contenedor de dependencias. Por ejemplo, si está registrada como &lt;em&gt;singleton&lt;/em&gt;, se devolverá siempre la misma instancia, independientemente de cómo se haya registrado la interfaz; si es &lt;em&gt;transient&lt;/em&gt;, se creará una nueva instancia cada vez que se solicite. En el caso anterior, como se ha registrado como &lt;em&gt;scoped&lt;/em&gt;, se devolverá la misma instancia en el ámbito actual (si estamos en una petición ASP.NET Core, mientras ésta esté siendo procesada).&lt;/p&gt;
&lt;p&gt;Sencillo, ¿eh?&lt;/p&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/4226690196518028022/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/4226690196518028022' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4226690196518028022'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4226690196518028022'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/01/usar-factorias-para-devolver-la-misma.html' title='Usar factorías para devolver la misma instancia desde el contenedor de servicios de .NET'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz6fcGWm3Krvoxg2G04FtJAbnMNeVSYhRN61SqLzv_yHBF0x_f6geEv42ndwt04nEaBEW0D2u3_ecQERet9LmChxuLDIZMwjveB6bPgA3W5ybxRmJshZUUrD6gwnHwJH9cZmHAMh30UnjDaMkgmU_UbtO-X99sScZ43VOAHOw9xDgFk46it1AM6w/s72-c/factorias.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-8065665540159691087</id><published>2026-01-19T08:05:00.031+01:00</published><updated>2026-01-19T08:05:00.113+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 633</title><content type='html'>&lt;img alt=&quot;Desarrollador con un Spectrum celebrando el vigésimo aniversario de jQuery&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6BM_u7ktvObtG8iMnM57RBeylDn6ZOhehSAukSMEhmYVn7_7FO5BoNlJOEOK3PuZ76-99NUqoMZ3RwmRn9mlpOn-alouou35J5HZVzNrK7cipodDdQPgU_lbIbYQb0NoRgcegl-EKXWe_korpRYa5vDOXmjEe6_l44-jE3YMFjxO2d8u3mh_lYA/s800/jquery-20years.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Ya tenemos lista la recopilación de enlaces a contenidos que he ido descubriendo a lo largo de la semana pasada. Como siempre, mucha información interesante para seguir aprendiendo y estar al día.&lt;/p&gt;
&lt;p&gt;Merece la pena destacar el post de José Manuel Alarcón descubriéndonos &lt;a href=&quot;https://www.campusmvp.es/recursos/post/el-punto-y-coma-en-programacion-necesario-o-un-dolor-de-cabeza.aspx&quot; target=&quot;_blank&quot;&gt;por qué muchos desarrolladores usamos el punto y coma, y dónde está su origen.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Muy interesante y curioso el artículo interactivo de Alex Harri sobre la &lt;a href=&quot;https://alexharri.com/blog/ascii-rendering&quot; target=&quot;_blank&quot;&gt;representación de imágenes usando caracteres ASCII&lt;/a&gt;, el ASCII-art de toda la vida.&lt;/p&gt;
&lt;p&gt;Y me ha llamado la atención el vigésimo aniversario de jQuery, todo un clásico que, aunque ha dejado de ser la opción por defecto para muchos, sigue siendo la biblioteca más usada de la web, y continúa su evolución&amp;nbsp;&lt;a href=&quot;https://blog.jquery.com/2026/01/17/jquery-4-0-0/&quot; target=&quot;_blank&quot;&gt;presentando la versión 4.0.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En resto de contenidos, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/01/se-pueden-introducir-directivas-o.html&quot;&gt;¿Se pueden introducir directivas o lógica de inicialización en todas las vistas y páginas sin duplicar código?&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/11/taskwheneach-en-net-9-procesa-tareas.html&quot;&gt;Task.WhenEach() en .NET 9: Procesa tareas conforme se van completando&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/updates-to-netescapaades-enumgenerators-new-apis-and-system-memory-support/&quot;&gt;Recent updates to NetEscapades.EnumGenerators: new APIs and System.Memory support&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nemorize.com/roadmaps/mastering-memory-management-and-garbage-collection-in-net&quot;&gt;Mastering Memory Management and Garbage Collection in .NET&lt;/a&gt;&lt;br /&gt;
Nemorize&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/add-header-and-footer-in-pdf-using-csharp&quot;&gt;Add Headers, Footers, and Page Numbers to PDFs in C#&lt;/a&gt;&lt;br /&gt;
Chinnu Muniyappan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.josephguadagno.net/2026/01/10/generate-an-open-graph-profile-image-with-c-sharp&quot;&gt;Generate an Open Graph Profile Image with C#&lt;/a&gt;&lt;br /&gt;
Joseph Guadagno&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/352fe495-9cc4-4df8-8ad1-a3e26a64185c&quot;&gt;Collection Expression Arguments in C# 15+&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.textcontrol.com/blog/2026/01/09/explaining-contract-tracked-changes-automatically-using-dotnet-csharp-and-ai/&quot;&gt;Explaining Contract Tracked Changes Automatically Using .NET C# and AI&lt;/a&gt;&lt;br /&gt;
Bjoern Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.peterritchie.com/posts/announcing-dotnetpscmds-powershell-cmdlets-for-dotnet&quot;&gt;Announcing DotnetPsCmds - PowerShell CmdLets for .NET&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.aligneddev.net/blog/2026/compile-time-checking-string-parameters-csharp/&quot;&gt;Compile Time Checking of String Parameters in C#&lt;/a&gt;&lt;br /&gt;
Kevin Logan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.i-programmer.info/programming/100-c/1039-using-the-console.html&quot;&gt;Deep C# - The Console&lt;/a&gt;&lt;br /&gt;
Mike James&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/new-in-net-10-and-c-14-enhancements-in-apis-request-response-pipeline/&quot;&gt;New in .NET 10 and C# 14: Enhancements in APIs Request/Response Pipeline&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.stevejgordon.co.uk/encrypting-properties-with-system-text-json-and-a-typeinforesolver-modifier-part-1&quot;&gt;Encrypting Properties with System.Text.Json and a TypeInfoResolver Modifier (Part 1)&lt;/a&gt;&lt;br /&gt;
Steve Gordon&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/01/05/set-the-amr-claim-when-using-passkeys-authentication-in-asp-net-core/&quot;&gt;Set the amr claim when using passkeys authentication in ASP.NET&amp;nbsp;Core&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.c-sharpcorner.com/article/how-do-i-improve-performance-in-asp-net-core-apis/&quot;&gt;How Do I Improve Performance in ASP.NET Core APIs?&lt;/a&gt;&lt;br /&gt;
Mahesh Chand&lt;/li&gt;
&lt;li&gt;Enterprise Patterns for ASP.NET Core &lt;a href=&quot;https://www.woodruff.dev/enterprise-patterns-for-asp-net-core-minimal-api-lazy-load-pattern/&quot;&gt;Minimal API: Lazy Load Pattern&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.woodruff.dev/enterprise-patterns-for-asp-net-core-front-controller-and-mvc-pattern/&quot;&gt;E Front Controller and MVC Pattern&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2026/01/12/implementing-level-of-authentication-loa-with-asp-net-core-identity-and-duende/&quot;&gt;Implementing Level of Authentication (LoA) with ASP.NET Core Identity and&amp;nbsp;Duende&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/collaborative-editing-in-blazor-diagram&quot;&gt;Collaborative Editing in Blazor Diagram Using SignalR and Redis&lt;/a&gt;&lt;br /&gt;
Suganthi Karuppannan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/file-logging-aspnet-core-made-easy-serilog&quot;&gt;File logging in ASP.NET Core made easy with Serilog&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/aspire/aspire-for-javascript-developers/&quot;&gt;Aspire for JavaScript developers&lt;/a&gt;&lt;br /&gt;
Paulo Pinto&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/frontend/enterprise-blazor-ssr-wasm-hybrid-architecture/&quot;&gt;Practical Blazor SSR + WASM Hybrid Architecture for High-Performance .NET Frontends&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/getting-started-blazor-inline-ai-prompt-component&quot;&gt;Getting Started with the Blazor Inline AI Prompt Component&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/building-resilient-apis-retry-pattern&quot;&gt;Building Resilient APIs with the Retry Pattern&lt;/a&gt;&lt;br /&gt;
Assis Zang&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/aspnet-core-ai-smart-paste-button&quot;&gt;AI-Powered Smart Paste: A Smarter Way to Fill ASP.NET Core Forms&lt;/a&gt;&lt;br /&gt;
Arun Kumar Ragu&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mssqltips.com/sqlservertip/11578/introducing-google-cloud-sql/&quot;&gt;Introducing Google Cloud SQL&lt;/a&gt;&lt;br /&gt;
Greg Robidoux&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/context-is-the-bottleneck-in-software-development/&quot;&gt;Context Is the Bottleneck in Software Development&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/alphabet-soup-file-formats/&quot;&gt;Alphabet Soup: The Format Buffet Nobody Ordered&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/solving-message-ordering-from-first-principles&quot;&gt;Solving Message Ordering from First Principles&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2026/01/05/manejo-de-ubigeos-en-net-con-ef-core/&quot;&gt;Manejo de ubigeos en .NET con EF Core&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://markheath.net/post/2026/1/8/efcore-lazy-loader-gotcha&quot;&gt;EF Core Lazy Loading Performance Gotcha&lt;/a&gt;&lt;br /&gt;
Mark Heath&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/mongodb-efcore-provider-queryable-encryption-vector-search/&quot;&gt;EF Core MongoDB Queryable Encryption and Vector Search Explained&lt;/a&gt;&lt;br /&gt;
Rafael Veronezi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/named-global-query-filters-were-updated-in-ef-core-10&quot;&gt;Named Global Query Filters Were Updated in EF Core 10&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/gemini-file-api-5x.aspx&quot;&gt;Google multiplica por 5 el límite de tamaño de la File API de Gemini... pero ha hecho algo mucho mejor todavía&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/generative-ai-with-large-language-models-in-dotnet-and-csharp/&quot;&gt;Generative AI: The Future of Consumer Technology&lt;/a&gt;&lt;br /&gt;
S. Majumder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antirez.com/news/158&quot;&gt;Don&#39;t fall into the anti-AI hype&lt;/a&gt;&lt;br /&gt;
Antirez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/mcp-is-a-transport-not-an-architecture&quot;&gt;MCP Is a Transport, Not an Architecture (English)&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/el-protocolo-de-verificacion-de-email-evp-para-desarrolladores-web.aspx&quot;&gt;Adiós al &quot;Revisa tu Correo&quot;: el nuevo protocolo de verificación de email (EVP) para desarrolladores web (explicado a fondo)&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/01/servir-contenido-estatico-desde-github-con-la-cdn-jsdelivr-gratis/&quot;&gt;Servir contenido estático desde GitHub con la CDN jsDelivr GRATIS&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/future-css-drag-and-maybe-dragged-image/&quot;&gt;Future CSS: :drag (and Maybe ::dragged-image?)&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hackernoon.com/everythings-async-until-your-ram-explodes-the-javascript-backpressure-problem&quot;&gt;“Everything’s Async” Until Your RAM Explodes: The JavaScript Backpressure Problem&lt;/a&gt;&lt;br /&gt;
Gabor Koos&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterkellner.net/2026/01/09/understanding-react-useeffectevent-vs-useeffect/&quot;&gt;Understanding React&#39;s useEffectEvent: A Complete Guide to Solving Stale Closures&lt;/a&gt;&lt;br /&gt;
Peter Kellner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/egorovsa/conditional-typescript-generics-in-react-components-39fj&quot;&gt;Conditional TypeScript Generics in React Components&lt;/a&gt;&lt;br /&gt;
Meme Monday&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daverupert.com/2026/01/nested-contrast-color-focus-rings/&quot;&gt;Focus rings with nested contrast-color()?&lt;/a&gt;&lt;br /&gt;
Dave Rupert&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/01/smashing-animations-part-8-css-relative-colour/&quot;&gt;Smashing Animations Part 8: Theming Animations Using CSS Relative Colour&lt;/a&gt;&lt;br /&gt;
Andy Clarke&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.i-programmer.info/programming/113-javascript/18591-javascript-canvas-webgl-a-3d-cube.html&quot;&gt;JavaScript Canvas - WebGL A 3D Cube&lt;/a&gt;&lt;br /&gt;
Ian Elliot&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-3/&quot;&gt;What’s !important&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/video-preview-in-angular-file-upload&quot;&gt;How to Preview Videos Before Uploading Files in Angular File Upload&lt;/a&gt;&lt;br /&gt;
UdhayaKumar Duraisamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aurelia.io/blog/2026/1/14/aurelia-2-release-candidate/&quot;&gt;Aurelia 2 Release Candidate: It&#39;s Finally Happening&lt;/a&gt;&lt;br /&gt;
Dwayne Charrington&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jquery.com/2026/01/17/jquery-4-0-0/&quot;&gt;jQuery 4.0.0&lt;/a&gt;&lt;br /&gt;
Timmy Willison&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/customization/agent-skills&quot;&gt;Use Agent Skills in VS Code&lt;/a&gt;&lt;br /&gt;
VS Code Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/windows-explorer-replacement-filepilot-is-awesome/&quot;&gt;The Windows File Explorer replacement, File Pilot, is awesome&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/how-to-build-android-widgets-with-dotnet-maui/&quot;&gt;How to Build Android Widgets with .NET MAUI&lt;/a&gt;&lt;br /&gt;
Toine de Boer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/choose-right-dotnet-maui-picker&quot;&gt;Choosing the Right .NET MAUI Picker: Date, Time, and Lists Made Simple&lt;/a&gt;&lt;br /&gt;
Hariram Subramanian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/gauge-controls-real-time-performance-tracking-player-stats&quot;&gt;Gauge Controls: Real-time Performance Tracking, Player Stats&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/el-punto-y-coma-en-programacion-necesario-o-un-dolor-de-cabeza.aspx&quot;&gt;El punto y coma en programación: ¿necesario o un dolor de cabeza?&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.3d-logic.com/2026/01/04/building-a-computer-thats-older-than-the-internet/&quot;&gt;Building a Computer That’s Older Than the&amp;nbsp;Internet&lt;/a&gt;&lt;br /&gt;
Pawel Kadluczka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alexharri.com/blog/ascii-rendering&quot;&gt;ASCII characters are not pixels: a deep dive into ASCII rendering&lt;/a&gt;&lt;br /&gt;
Alex Harri&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/8065665540159691087/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/8065665540159691087' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8065665540159691087'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8065665540159691087'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/01/enlaces-interesantes-633.html' title='Enlaces interesantes 633'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6BM_u7ktvObtG8iMnM57RBeylDn6ZOhehSAukSMEhmYVn7_7FO5BoNlJOEOK3PuZ76-99NUqoMZ3RwmRn9mlpOn-alouou35J5HZVzNrK7cipodDdQPgU_lbIbYQb0NoRgcegl-EKXWe_korpRYa5vDOXmjEe6_l44-jE3YMFjxO2d8u3mh_lYA/s72-c/jquery-20years.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-885861409851930071</id><published>2026-01-12T08:05:00.021+01:00</published><updated>2026-01-12T08:05:00.114+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging"/><category scheme="http://www.blogger.com/atom/ns#" term="variablenotfound"/><title type='text'>Top 10 posts 2025 en Variable not found</title><content type='html'>&lt;img alt=&quot;Top 10 posts 2025 en Variable not found&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZhLyBfucEPwxTw2dFPFbrU8I6yztZM0HloWPlKzlZDdiRVZawPyyprNekTpRi2TGNqXyo4d-aV8NBaYzXsiHKAIf2lLpPMxycdWLSfyv7vTDqkQHQO9iiXNL-t1wyaiMcfxGP3qVt_uhFKthpGTJ_Ff1Pe9y2xE5yPRi0IgeQaYlMa2enRj4_A/s1600/topten2025.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Desde hace ya casi veinte años, reservo el primer post de enero para compartir con vosotros los contenidos más leídos del año anterior, sobre todo para asegurarme de que no os habéis perdido ninguno de ellos 😊&lt;/p&gt;
&lt;p&gt;Así que, como no podía ser de otra forma, aquí tenéis los &lt;em&gt;top posts&lt;/em&gt; de 2025, una lista prácticamente copada por artículos relacionados con .NET y C#, especialmente en sus últimas versiones, que han sido los grandes protagonistas del año en el blog.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Top 10 posts 2025 en Variable not found&lt;/h2&gt;
&lt;p&gt;Empezando por el final de la lista, en el puesto número 10 encontramos el post &lt;a href=&quot;https://www.variablenotfound.com//2025/10/extension-members-en-c-14-net-10.html&quot;&gt;Extension members en C# 14 (.NET 10)&lt;/a&gt;, donde hablamos de una de las novedades más interesantes del lenguaje C# en su versión 14: los bloques &lt;code&gt;extension&lt;/code&gt; y la nueva capacidad para crear propiedades extensoras o extender tipos estáticos.&lt;/p&gt;
&lt;p&gt;Justo a continuación, en la posición número 9 vemos que a la hora de buscar valores en el interior de un conjunto de datos en memoria, podemos hacer como siempre: recorrerlo manualmente hasta detectar lo que buscamos... o bien exprimir al máximo las capacidades del hardware más moderno y su soporte en .NET 10. Explicamos cómo hacerlo en el artículo &lt;a href=&quot;https://www.variablenotfound.com/2025/03/dispara-la-eficiencia-de-tus-busquedas.html&quot;&gt;Dispara la eficiencia de tus búsquedas en memoria con .NET usando SearchValues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En octavo lugar, el post &lt;a href=&quot;https://www.variablenotfound.com/2025/05/simulando-enumerados-de-texto-en-c.html&quot;&gt;Simulando enumerados de texto en C#&lt;/a&gt; muestra cómo, abusando un poco de conversores implícitos y algunos otros truquillos, podemos crear enumerados de texto, algo que encontramos en otros lenguajes pero que no está soportado de forma nativa en C#.&lt;/p&gt;
&lt;p&gt;Seguimos ascendiendo en la lista, y encontramos algo que, a tenor de las visitas recibidas, parece preocuparnos a muchos: cómo gestionar de forma centralizada las dependencias NuGet en soluciones de gran tamaño. El post &lt;a href=&quot;https://www.variablenotfound.com/2025/01/gestion-centralizada-de-paquetes-nuget.html&quot;&gt;Gestión centralizada de paquetes NuGet en soluciones y proyectos .NET&lt;/a&gt; describe el CPM (Central Package Management) de .NET y muestra diferentes escenarios y posibilidades de uso.&lt;/p&gt;
&lt;p&gt;Reconozcamos que los desarrolladores .NET siempre hemos mirado con envidia a otros lenguajes o tecnologías que permitían escribir &lt;em&gt;scripts&lt;/em&gt; ejecutables directamente desde la línea de comandos, como Python o Node.js. Pues, como mostramos en el post &lt;a href=&quot;https://www.variablenotfound.com/2025/06/ejecutar-directamente-archivos-c-desde.html&quot;&gt;Ejecutar directamente archivos C# desde línea de comandos con &quot;dotnet run&quot;&lt;/a&gt;, esto ya es posible en .NET 10 y C# 14, gracias a la nueva capacidad de ejecutar archivos &lt;code&gt;.cs&lt;/code&gt; directamente con &lt;code&gt;dotnet run &amp;lt;filename.cs&amp;gt;&lt;/code&gt;, sin necesidad de crear proyectos o soluciones, ni de compilar nada previamente.&lt;/p&gt;
&lt;p&gt;Y llegamos al ecuador de la lista, con el post &lt;a href=&quot;https://www.variablenotfound.com/2025/10/8-cosas-que-quizas-no-conocias-sobre-la.html&quot;&gt;8 cosas que (quizás) no conocías sobre la clase Random de .NET&lt;/a&gt;, donde repasamos algunas curiosidades y funcionalidades poco conocidas de esta clase tan utilizada en multitud de aplicaciones, y cuya potencia y posibilidades suelen pasar desapercibidas.&lt;/p&gt;
&lt;p&gt;Ya en el cuarto puesto, rondando el podio, hablamos de los peligros de no gestionar correctamente las excepciones no controladas en servicios en segundo plano (BackgroundService) en aplicaciones ASP.NET Core. En el post &lt;a href=&quot;https://www.variablenotfound.com//2025/02/cuidado-con-las-excepciones-no.html&quot;&gt;¡Cuidado con las excepciones no controladas de servicios en segundo plano (BackgroundService) en ASP.NET Core!&lt;/a&gt; explicamos el problema, que incluso puede llegar a detener por completo aplicaciones en producción, y cómo podemos solucionarlo para hacer nuestras aplicaciones más robustas y fiables.&lt;/p&gt;
&lt;p&gt;En tercera posición, el post &lt;a href=&quot;https://www.variablenotfound.com/2025/02/aprovecha-al-maximo-los-archivos-http.html&quot;&gt;Aprovecha al máximo los archivos .http en Visual Studio usando variables dinámicas&lt;/a&gt; describe las mejoras introducidas en Visual Studio para trabajar con archivos &lt;code&gt;.http&lt;/code&gt;, que nos permiten crear y ejecutar peticiones HTTP directamente desde el editor, y cómo podemos usar variables dinámicas para hacerlos aún más potentes y flexibles. Personalmente, me encantan estos archivos para probar y documentar APIs RESTful de forma rápida y sencilla, y parece que no soy el único, ya que este post ha tenido una gran acogida.&lt;/p&gt;
&lt;p&gt;El segundo puesto es para el post &lt;a href=&quot;https://www.variablenotfound.com/2025/04/obtener-informacion-sobre-el-origen-de.html&quot;&gt;Obtener información sobre el origen de la invocación de un método con los atributos &quot;caller info&quot; de .NET&lt;/a&gt;, donde explicamos cómo usar atributos como &lt;code&gt;CallerMemberName&lt;/code&gt;, &lt;code&gt;CallerFilePath&lt;/code&gt;, &lt;code&gt;CallerLineNumber&lt;/code&gt; y &lt;code&gt;CallerArgumentExpression&lt;/code&gt; para obtener información sobre quién llamó a un método, desde qué archivo, en qué línea, y qué expresiones se utilizaron como argumentos de la llamada, lo que puede ser muy útil para depuración, &lt;em&gt;logging&lt;/em&gt; y otras tareas similares.&lt;/p&gt;
&lt;p&gt;Y por fin en el puesto número uno, el post más leído del año 2025 en Variable not found ha sido &lt;a href=&quot;https://www.variablenotfound.com/2025/03/javascriptizando-c-chequeo-de-nulos.html&quot;&gt;JavaScriptizando C#: chequeo de nulos usando conversores implícitos&lt;/a&gt;, donde mostramos que la extensibilidad de C# nos permite lograr chequear nulos usando una sintaxis similar a la habitual de JavaScript.&lt;/p&gt;
&lt;h2&gt;Menciones especiales&lt;/h2&gt;
&lt;p&gt;Por último, creo que vale la pena destacar dos posts que prácticamente empataban con la posición número 10, y que finalmente tuve que dejar fuera del top ten. Unos aplausos también para ellos 😉&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Comparar &lt;em&gt;strings&lt;/em&gt; ha sido siempre bastante sencillo, pero no cuando se trata de ordenar o comparar valores numéricos incluidos en el interior de cadenas de texto. El post &lt;a href=&quot;https://www.variablenotfound.com/2025/04/comparacion-natural-de-cadenas-en-net-10.html&quot;&gt;Comparación natural de cadenas en .NET 10&lt;/a&gt; trata de la interesante novedad de .NET 10 que hará posible que &quot;1.2&quot; por fin pueda considerarse mayor que &quot;1.10&quot; sin necesidad de recurrir a complicadas funciones personalizadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Los archivos de solución de .NET &quot;.sln&quot; siempre han sido extensos, crípticos y difícilmente editables manualmente, pero esto se acabó. En el artículo &lt;a href=&quot;https://www.variablenotfound.com/2025/11/slnx-el-nuevo-formato-de-soluciones-net.html&quot;&gt;.SLNX: El nuevo formato de soluciones .NET&lt;/a&gt; hablamos del nuevo formato de soluciones &quot;.slnx&quot; introducido en .NET 10, abierto, más simple, conciso y ligero.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/885861409851930071/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/885861409851930071' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/885861409851930071'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/885861409851930071'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/01/top-10-posts-2025-en-variable-not-found.html' title='Top 10 posts 2025 en Variable not found'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZhLyBfucEPwxTw2dFPFbrU8I6yztZM0HloWPlKzlZDdiRVZawPyyprNekTpRi2TGNqXyo4d-aV8NBaYzXsiHKAIf2lLpPMxycdWLSfyv7vTDqkQHQO9iiXNL-t1wyaiMcfxGP3qVt_uhFKthpGTJ_Ff1Pe9y2xE5yPRi0IgeQaYlMa2enRj4_A/s72-c/topten2025.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-8269980624624584495</id><published>2025-12-22T08:05:00.049+01:00</published><updated>2025-12-22T08:05:00.112+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 632</title><content type='html'>&lt;img alt=&quot;Estampida arrasando una oficina con desarrolladores&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxBDiDi2sJ6m5YPxKtXMnBxcX__g9NDz71FlKUQBsITu0H28iJ6Wn-uAssmAxw-hcLEgLFlF6d8v_z9Q0zX0ZPhyphenhyphenSHg7jJFjUCnlxE9vKu_ycodzTbatxc44O-lA8aLywDtAtUASrnpPqVQX15sgNL_DmQuJG2Ft0AZYdFkJLcKTeKdc7wWHa_Fg/s800/stampede.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Mucho contenido interesante en la última recopilación del año 🙂&lt;/p&gt;
&lt;p&gt;Me ha alegrado verde nuevo a Juan María Hernández que, tras algunos años de parón, vuelve con una reflexión bastante certera sobre &lt;a href=&quot;https://blog.koalite.com/2025/12/sobre-velocidad-y-coste-de-desarrollo&quot; target=&quot;_blank&quot;&gt;por qué el proceso de desarrollo es cada vez más lento y costoso conforme los productos van creciendo&lt;/a&gt; en complejidad. Os recomiendo su lectura.&lt;/p&gt;
&lt;p&gt;También me ha parecido interesante el artículo de Alexey Fedorov sobre el &lt;a href=&quot;https://www.alexeyfv.xyz/en/post/2025-12-17-cache-stampede-in-dotnet/&quot; target=&quot;_blank&quot;&gt;devastador efecto de una estampida en la caché de nuestras aplicaciones&lt;/a&gt;, junto con algunas estrategias para evitarlo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/TopSwagCode/MinimalWorker/&quot; target=&quot;_blank&quot;&gt;El proyecto MinimalWorker&lt;/a&gt;, de Joshua Jesper Krægpøth Ryder, puede resultar útil para reducir significativamente el boilerplate necesario para registrar workers en aplicaciones ASP.NET Core y .NET.&lt;/p&gt;
&lt;p&gt;Vladan Petrovic nos muestra&amp;nbsp;&lt;a href=&quot;https://trailheadtechnology.com/tunit-the-new-sheriff-in-town-for-net-testing/&quot; target=&quot;_blank&quot;&gt;TUnit, un nuevo framework de testing para .NET&lt;/a&gt; que promete ser una alternativa interesante a los ya existentes.&lt;/p&gt;
&lt;p&gt;Y, como siempre, vale la pena leer a Derek Comartin, esta vez reflexionando sobre por qué &lt;a href=&quot;https://codeopinion.com/why-microservices-debates-miss-the-point/&quot; target=&quot;_blank&quot;&gt;los debates sobre si debemos usar o no microservicios suelen perder el foco&lt;/a&gt; del verdadero problema que se intenta resolver: el acoplamiento.&lt;/p&gt;&lt;p&gt;Por último, como este será el último recopilatorio hasta la vuelta de las fiestas navideñas,  aprovecho para &lt;strong&gt;desearos a todos unas felices fiestas y un próspero año nuevo 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por si te lo perdiste...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2018/12/otras-formas-de-obtener-dependencias-en.html&quot;&gt;Otras formas de obtener dependencias en controladores ASP.NET Core MVC&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/10/propiedades-parciales-en-c-13-y-net-9.html&quot;&gt;Propiedades parciales en C# 13 y .NET 9&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codemag.com/article/2511061&quot;&gt;Custom Scripting for Web Applications&lt;/a&gt;&lt;br /&gt;
Nevio Medancic, Enzo Grubisa &amp;amp; Vassili Kaplan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.conradakunga.com/blog/dynamically-changing-decimal-thousand-separators-at-runtime/&quot;&gt;Dynamically Changing Decimal &amp;amp; Thousand Separators At Runtime&lt;/a&gt;&lt;br /&gt;
Conrad Akunga&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trailheadtechnology.com/tunit-the-new-sheriff-in-town-for-net-testing&quot;&gt;TUnit: The New Sheriff in Town for .NET Testing&lt;/a&gt;&lt;br /&gt;
Vladan Petrovic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/csharp/refactoring-legacy-csharp-to-modern-csharp/&quot;&gt;Refactoring Legacy C# Codebases: Modernizing Async, Collections, and Architecture for Safe, Maintainable .NET&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.code4it.dev/csharptips/custom-csharp-attributes-reflection/&quot;&gt;C# Tip How to create and access custom C# Attributes by using Reflection&lt;/a&gt;&lt;br /&gt;
Davide Bellone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/creating-a-dotnet-profiler-using-csharp-with-silhouette/&quot;&gt;Creating a .NET CLR profiler using C# and NativeAOT with Silhouette&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-7-comparative-review/&quot;&gt;.NET Job Scheduling — Choosing the Right Framework&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/new-in-net-10-and-c-14-optimizations-in-log-aggregation-jobs/&quot;&gt;New in .NET 10 and C# 14: Optimizations in log aggregation jobs&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/federico_alterio_5ff46735/angular-signals-but-better-now-for-net-2jib&quot;&gt;Angular Signals, But Better Now for .NET&lt;/a&gt;&lt;br /&gt;
I Looked Inside .git and You Won&#39;t Believe What I Found&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/analysing-large-csv-files-with-local-llms&quot;&gt;How to Analyse Large CSV Files with Local LLMs in C# (English)&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-cli-expanding-scope-autocomplete/&quot;&gt;Stop Typing: The .NET CLI Tab Completion You&#39;ve Been Missing&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@timmaes/flatten-your-models-with-facet-net-e578316f4c2e&quot;&gt;Flatten your models with Facet .NET&lt;/a&gt;&lt;br /&gt;
Tim Maes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/fetching-and-analysing-web-content-with-llms&quot;&gt;Fetching and Analysing Web Content with LLMs in C#&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thatamazingprogrammer.com/posts/streams-record-truth-queues-do-work-a-dotnet-way-to-keep-them-straight/&quot;&gt;Streams Record Truth. Queues Do Work: A .NET Way To Keep Them Straight&lt;/a&gt;&lt;br /&gt;
Christopher Johnson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alexeyfv.xyz/en/post/2025-12-17-cache-stampede-in-dotnet/&quot;&gt;Your cache is not protected from cache stampede&lt;/a&gt;&lt;br /&gt;
Alexey Fedorov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codemag.com/article/2507051&quot;&gt;The New Features and Enhancements in .NET 10&lt;/a&gt;&lt;br /&gt;
Joydip Kanjilal&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2025/12/14/net-10-en-el-desarrollo-de-apis-rest-modernas-que-aporta-realmente-en-la-industria/&quot;&gt;.NET 10 en el desarrollo de APIs REST modernas: Qué aporta realmente en la industria&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/TopSwagCode/MinimalWorker/&quot;&gt;MinimalWorker: simplify background worker registration in ASP.NET Core and .NET applications&lt;/a&gt;&lt;br /&gt;
Joshua Jesper Krægpøth Ryder
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2025/12/showing-custom-metrics-in-aspire.html&quot;&gt;Showing custom metrics in Aspire&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.brickstarter.net/blog/post/blazor-saas-starter-kits-compared-brick-starter&quot;&gt;Blazor SaaS Starter Kits Compared: When to Choose Brick Starter for Full‑Stack C#&lt;/a&gt;&lt;br /&gt;
Brick Starter Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/net-code-chronicles/clean-architecture-blazor-ddd-cqrs-8029fa4cec0d&quot;&gt;Clean Architecture for Blazor with DDD &amp;amp; CQRS&lt;/a&gt;&lt;br /&gt;
Aliaksandr Marozka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/net-code-chronicles/mvvm-vs-mvu-blazor-c27429207dfa&quot;&gt;MVVM vs MVU in Blazor for Enterprise Apps&lt;/a&gt;&lt;br /&gt;
Aliaksandr Marozka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aspire.dev/deployment/azure/aca-deployment-aspire-cli/&quot;&gt;Deploy Aspire to Azure Container Apps using the Aspire CLI&lt;/a&gt;&lt;br /&gt;
Aspire Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/managing-content-security-telerik-aspnet-core-applications&quot;&gt;Managing Content Security in Telerik ASP.NET Core Applications&lt;/a&gt;&lt;br /&gt;
Peter Vogel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/blazor-basics-webassembly-using-local-storage-offline-scenarios&quot;&gt;Blazor WebAssembly Using Local Storage in Offline Scenarios&lt;/a&gt;&lt;br /&gt;
Claudio Bernasconi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/itopstalkblog/json-web-token-jwt-validation-in-azure-application-gateway-secure-your-apis-at-t/4479428&quot;&gt;JSON Web Token (JWT) Validation in Azure Application Gateway: Secure Your APIs at the Gate&lt;/a&gt;&lt;br /&gt;
Pierre Roman&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/why-microservices-debates-miss-the-point/&quot;&gt;Why “Microservices” Debates Miss the Point&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/55dbb67c-cd14-444f-81e8-dec9f5ce1448&quot;&gt;One Minute Knowledge: Is ToArrayAsync or ToListAsync faster for Entity Framework?&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/mohammad_aliebrahimzadeh/introducing-keplercore-smart-field-selection-for-ef-core-apis-4da2&quot;&gt;Introducing Kepler.Core — Smart Field Selection for EF Core APIs&lt;/a&gt;&lt;br /&gt;
Mohammad Ali Ebrahimzadeh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/ef-core-bulk-data-retrieval-5-methods-you-should-know&quot;&gt;EF Core Bulk Data Retrieval: 5 Methods You Should Know&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trailheadtechnology.com/ef-core-10-turns-postgresql-into-a-hybrid-relational-document-db/&quot;&gt;EF Core 10 Turns PostgreSQL into a Hybrid Relational-Document DB&lt;/a&gt;&lt;br /&gt;
Stefan Mitic&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-2-codex/&quot;&gt;Introducing GPT-5.2-Codex&lt;/a&gt;&lt;br /&gt;
OpenAI Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2025/12/14/what-building-ai-agents-in-net-taught-me-in-2025/&quot;&gt;What Building AI Agents in .NET Taught Me in 2025&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build5nines.com/prompt-noise-is-killing-your-ai-accuracy-how-to-optimize-context-for-grounded-output/&quot;&gt;Prompt Noise Is Killing Your AI Accuracy: How to Optimize Context for Grounded Output&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cookbook.openai.com/examples/gpt-5/gpt-5-2_prompting_guide&quot;&gt;GPT-5.2 Prompting Guide&lt;/a&gt;&lt;br /&gt;
Mandeep Singh &amp;amp; Emre Okcular&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2025/12/18/%f0%9f%a4%96-local-ai-power-vision-and-function-calling-with-microsoft-agent-framework-and-ollama/&quot;&gt;Local AI Power: Vision and Function Calling with Microsoft Agent Framework and Ollama&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/understanding-rag-retrieval-augmented-generation&quot;&gt;Understanding RAG (Retrieval-Augmented Generation)&lt;/a&gt;&lt;br /&gt;
Hassan Djirdeh&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Responsive List of Avatars Using Modern CSS,&amp;nbsp;&lt;a href=&quot;https://css-tricks.com/responsive-list-of-avatars-using-modern-css-part-1/&quot;&gt;Part 1&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://css-tricks.com/responsive-list-of-avatars-using-modern-css-part-2/&quot;&gt;Part 2&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-1/&quot;&gt;What’s !important #1: Advent Calendars, CSS Wrapped, Web Platform Updates, and More&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/web-platform-12-2025&quot;&gt;New to the web platform in December&lt;/a&gt;&lt;br /&gt;
Rachel Andrew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/forced-colors-mode/&quot;&gt;Forced Colors Mode&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/implement-jwt-authentication-in-react&quot;&gt;JWT Authentication in React: Secure Routes, Context, and Token Handling&lt;/a&gt;&lt;br /&gt;
Prashant Yadav&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2025/12/smashing-animations-part-7-recreating-toon-text-css-svg/&quot;&gt;Smashing Animations Part 7: Recreating Toon Text With CSS And SVG&lt;/a&gt;&lt;br /&gt;
Andy Clarke&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codemag.com/article/2511021&quot;&gt;Add Some Class to Your JavaScript&lt;/a&gt;&lt;br /&gt;
Paul Sheriff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thenewstack.io/css-layout-how-to-center-a-div-the-old-school-way/&quot;&gt;CSS Layout: How To &#39;Center a Div,&#39; the Old School Way&lt;/a&gt;&lt;br /&gt;
Steven J. Vaugha&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/my-html-web-component-boilerplate-for-2026/&quot;&gt;My HTML Web Component boilerplate for 2026&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/vite-vs-webpack-react-apps-2025-senior-engineer/&quot;&gt;Vite vs. Webpack for react apps in 2025: A senior engineer’s perspective&lt;/a&gt;&lt;br /&gt;
Peter Aideloje&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/masonry-layout-is-now-grid-lanes/&quot;&gt;Masonry Layout is Now grid-lanes&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2025/12/18/productividad-avanzada-con-github-copilot-en-el-desarrollo-backend-con-net/&quot;&gt;Productividad avanzada con GitHub Copilot en el desarrollo backend con .NET&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://accessibleai.dev/post/writingaireadydotnetcode/&quot;&gt;16 Tips for Writing AI-Ready C# Code&lt;/a&gt;&lt;br /&gt;
Matt Eland&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/blog/browser-visual-editor&quot;&gt;A visual editor for the Cursor Browser&lt;/a&gt;&lt;br /&gt;
Cursor Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/microsoft-testing-platform-azure-retry/&quot;&gt;Microsoft.Testing.Platform Now Fully Supported in Azure DevOps&lt;/a&gt;&lt;br /&gt;
Jeff Bowman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-2026-debugging-with-copilot/&quot;&gt;Visual Studio 2026: Debugging with Copilot&lt;/a&gt;&lt;br /&gt;
David Kahler&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/behind-the-scenes-of-the-visual-studio-feedback-system/&quot;&gt;Behind the scenes of the Visual Studio feedback system&lt;/a&gt;&lt;br /&gt;
Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2025/12/17/microsoft-quietly-kills-intellicode-as-ai-strategy-shifts-to-copilot.aspx&quot;&gt;Microsoft Quietly Kills IntelliCode as AI Strategy Shifts to Subscription Copilot&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://minidump.net/investigating-a-deadlock-in-visual-studio/&quot;&gt;Investigating a deadlock in Visual Studio&lt;/a&gt;&lt;br /&gt;
Kevin Gosse&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/how-to-build-ios-widgets-with-dotnet-maui/&quot;&gt;How to Build iOS Widgets with .NET MAUI&lt;/a&gt;&lt;br /&gt;
Toine de Boer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/net-10-maui-exploring-new-diagnostics-metrics&quot;&gt;.NET 10 for .NET MAUI: Exploring New Diagnostics and Metrics&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.koalite.com/2025/12/sobre-velocidad-y-coste-de-desarrollo/&quot;&gt;Sobre velocidad y coste de desarrollo&lt;/a&gt;&lt;br /&gt;
Juan María Hernández&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.genbeta.com/desarrollo/a-desarrolladores-software-se-les-fue-manos-como-bautizan-ahora-todos-pagamos-impuesto-cognitivo-ello&quot;&gt;A los desarrolladores de software se les fue de las manos cómo lo bautizan. Y ahora todos pagamos un &#39;impuesto cognitivo&#39; por ello&lt;/a&gt;&lt;br /&gt;
Marcos Merino&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/8269980624624584495/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/8269980624624584495' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8269980624624584495'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8269980624624584495'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/12/enlaces-interesantes-632.html' title='Enlaces interesantes 632'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxBDiDi2sJ6m5YPxKtXMnBxcX__g9NDz71FlKUQBsITu0H28iJ6Wn-uAssmAxw-hcLEgLFlF6d8v_z9Q0zX0ZPhyphenhyphenSHg7jJFjUCnlxE9vKu_ycodzTbatxc44O-lA8aLywDtAtUASrnpPqVQX15sgNL_DmQuJG2Ft0AZYdFkJLcKTeKdc7wWHa_Fg/s72-c/stampede.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7209680185522581744</id><published>2025-12-16T08:05:00.005+01:00</published><updated>2026-01-16T19:00:29.918+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="rendimiento"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><title type='text'>¿Estás usando tus expresiones regulares en .NET de forma óptima?</title><content type='html'>&lt;img alt=&quot;Desarrollador viendo como el rendimiento de su aplicación desciende&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHoWa6udoLNmUGPaPt3o5iG8pF3JDZCFvqnibpdEMvFG5NQj6PKRxGqAEGlA-2RrU-wvMZRFPcvybrEzxiEGV8JLBAAfR4x4CucUijwON1385EgGc6AwRWhMxMC7xIdAl4Tzd07IFEHbCFi3MDLUpNbTRu93c53V9fnycVlppmVZ5RYcSGfJBGrA/s800/regex.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;La relación de muchos desarrolladores con las expresiones regulares es de amor-odio. Aunque indudablemente son una herramienta muy potente, su uso puede ser complicado y a menudo se convierten en un dolor de cabeza.&lt;/p&gt;
&lt;p&gt;Pero hoy no vamos a hablar de su (oscura) sintaxis, ni de lo difícil que es depurarlas, ni de cómo utilizarlas en .NET, sino de distintas técnicas que pueden ayudarnos a disparar su velocidad de proceso, algo bastante importante si las utilizamos en los procesos críticos o &lt;em&gt;hot paths&lt;/em&gt; de nuestra aplicación.&lt;/p&gt;
&lt;p&gt;En este artículo vamos comparar el rendimiento de distintos escenarios de uso de expresiones regulares, y cómo podemos optimizar su uso en .NET.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Chequear direcciones de email usando expresiones regulares&lt;/h2&gt;
&lt;p&gt;Como punto de partida, echemos un vistazo al siguiente código, un ejemplo donde definimos la clase estática &lt;code&gt;EmailValidator&lt;/code&gt;, con un método &lt;code&gt;IsValid()&lt;/code&gt; que utiliza la clase &lt;code&gt;RegEx&lt;/code&gt; para validar el email que recibe como parámetro:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;Console.WriteLine(EmailValidator.IsValid(&quot;john@server.com&quot;)); // true
Console.WriteLine(EmailValidator.IsValid(&quot;john@smith@server.com&quot;)); // false

public static class EmailValidator
{
    public static bool IsValid(string email)
    {
        string emailPattern = @&quot;^(?:[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+)*|&quot;&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$&quot;;
        var regex = new Regex(emailPattern, RegexOptions.IgnoreCase);
        return regex.IsMatch(email);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No vamos a entrar en el debate de si la expresión regular que hemos utilizado es la mejor para validar un email. Simplemente es la recomendación de un LLM asegurando que cumple la &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5322&quot;&gt;RFC 5322&lt;/a&gt;, y, para la prueba que queremos hacer es totalmente válida porque tiene una cierta complejidad.&lt;/p&gt;
&lt;p&gt;Si ejecutamos el código anterior, veremos que la expresión regular funciona correctamente y el método &lt;code&gt;IsMatch()&lt;/code&gt; nos devuelve &lt;code&gt;true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt; dependiendo de si el email es válido o no. Y además, aparentemente la ejecución es bastante rápida, suficiente si no es algo que se vaya a ejecutar con mucha frecuencia.&lt;/p&gt;
&lt;p&gt;Sin embargo, internamente, cada vez que llamamos a ese método estático &lt;code&gt;IsValid()&lt;/code&gt;, estamos instanciando la clase &lt;code&gt;Regex&lt;/code&gt; suministrándole el patrón de la expresión regular, que es parseado, verificado, optimizado, compilado y posteriormente ejecutado por un intérprete para realizar la validación que le estamos solicitando. Todo este proceso puede ser costoso en términos de rendimiento, sobre todo si esa parte del código se ejecuta con mucha frecuencia.&lt;/p&gt;
&lt;p&gt;Seguro que podemos mejorar esto...&lt;/p&gt;
&lt;h2&gt;Primera mejora: reutilización de &lt;code&gt;Regex&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La primera optimización que podemos aplicar en este punto es reutilizar la instancia de &lt;code&gt;Regex&lt;/code&gt;. De esta forma, evitaremos la sobrecarga de crear una nueva instancia cada vez que llamamos al método &lt;code&gt;IsValid()&lt;/code&gt; y evitaremos el proceso de verificación y compilación de la expresión regular.&lt;/p&gt;
&lt;p&gt;Esto podríamos conseguirlo fácilmente insertando en la clase anterior el siguiente código:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public static class EmailValidator
{
    private const string EmailPattern = @&quot;^(?:[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+)*|&quot;&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$&quot;;
    private static Regex SharedInstance = new Regex(EmailPattern, RegexOptions.IgnoreCase);

    public static bool IsValid_Shared(string email)
    {
        return SharedInstance.IsMatch(email);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si ejecutamos de nuevo la aplicación, veremos que el funcionamiento es exactamente el mismo, y que aparentemente sigue siendo igual de rápido. Pero si usamos &lt;a href=&quot;https://www.variablenotfound.com/2018/09/benchmarkdotnet-aranando-microsegundos.html&quot;&gt;BenchmarkDotNet&lt;/a&gt; para medir el rendimiento de las dos implementaciones, nos llevaremos una sorpresa:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method          | Mean       | Error     | StdDev    | Gen0    | Allocated |
|-----------------|-----------:|----------:|----------:|--------:|----------:|
| IsValid         | 206.716 us | 1.5089 us | 1.2600 us | 27.3438 |  233969 B |
| IsValid_Shared  |   2.742 us | 0.0312 us | 0.0276 us |       - |         - |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta segunda implementación se ejecuta casi &lt;strong&gt;80 veces más rápido&lt;/strong&gt; que la primera, sin consumo de memoria adicional. Impresionante, ¿verdad? Realmente se trata de &lt;strong&gt;una mejora brutal a cambio de muy poco esfuerzo&lt;/strong&gt; de implementación.&lt;/p&gt;
&lt;p&gt;Hay que tener en cuenta que las cifras no son siempre tan espectaculares, y que el rendimiento de la primera implementación puede variar dependiendo de la complejidad del patrón de la expresión regular. En expresiones más simples, la diferencia de rendimiento puede ser mucho menor, pero en cualquier caso habrá mejoras.&lt;/p&gt;
&lt;p&gt;Pero... ¿aún podemos hacerlo mejor?&lt;/p&gt;
&lt;h2&gt;Segunda mejora: compilación de la expresión regular&lt;/h2&gt;
&lt;p&gt;Por defecto, las expresiones regulares se compilan a una serie de instrucciones de alto nivel que indican las operaciones que deben realizarse para comprobar si la cadena de texto suministrada coincide con el patrón de la expresión regular. Luego, en cada llamada a &lt;code&gt;IsMatch()&lt;/code&gt; o métodos similares, un intérprete ejecuta esas instrucciones para realizar la validación.&lt;/p&gt;
&lt;p&gt;Sin embargo, la clase &lt;code&gt;Regex&lt;/code&gt; también permite &lt;strong&gt;compilar la expresión regular a código IL&lt;/strong&gt;, por lo que el &lt;em&gt;runtime&lt;/em&gt; de .NET puede ejecutarlo directamente e incluso, gracias al JIT, generar y ejecutar el código máquina nativo para la plataforma donde corre la aplicación, a cambio, eso sí, de consumir un poco más de memoria y tiempo durante su inicialización.&lt;/p&gt;
&lt;p&gt;Esto lo conseguimos de nuevo con muy poco esfuerzo, simplemente añadiendo el &lt;code&gt;RegexOptions.Compiled&lt;/code&gt; a la llamada al constructor de la clase &lt;code&gt;Regex&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;private static Regex SharedCompiledInstance 
  = new Regex(EmailPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si volvemos a llevarnos las tres opciones a BenchmarkDotNet, y medimos su rendimiento, veremos que en este último caso hemos mejorado algo más el rendimiento:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method            | Mean       | Error     | StdDev    | Gen0    | Allocated |
|------------------ |-----------:|----------:|----------:|--------:|----------:|
| IsValid           | 202.007 us | 2.4068 us | 2.2513 us | 27.3438 |  233969 B |
| IsValid_Shared    |   2.606 us | 0.0276 us | 0.0258 us |       - |         - |
| IsValid_Compiled  |   2.570 us | 0.0141 us | 0.0132 us |       - |         - |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En este caso la diferencia es mínima, pero es algo que también depende de la complejidad de las operaciones que hay que realizar para validar los valores contra la expresión regular. Por ejemplo, si en lugar de usar la expresión regular que hemos visto anteriormente para detectar emails, ejecutamos el mismo &lt;em&gt;benchmark&lt;/em&gt; para un patrón aparentemente simple como &lt;code&gt;&quot;(\d+)*\1&quot;&lt;/code&gt; y hacemos que se compruebe un &lt;code&gt;string&lt;/code&gt; numérico muy largo (unos 100.000 dígitos), la diferencia de rendimiento es mucho más notable:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method           | Mean     | Error    | StdDev   | Allocated |
|----------------- |---------:|---------:|---------:|----------:|
| IsValid          | 65.70 ms | 1.107 ms | 1.088 ms |    5401 B |
| IsValid_Shared   | 63.74 ms | 0.925 ms | 0.772 ms |      57 B |
| IsValid_compiled | 19.52 ms | 0.147 ms | 0.130 ms |      12 B |
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;La expresión regular &lt;code&gt;&quot;(\d+)*\1&quot;&lt;/code&gt; permite buscar cadenas que contengan un número seguido de un número repetido, como por ejemplo &lt;code&gt;123123&lt;/code&gt;, &lt;code&gt;456456&lt;/code&gt;, &lt;code&gt;789789&lt;/code&gt;, etc. Esta expresión regular es ejemplo conocido por dar lugar al llamado &lt;em&gt;catastrophic backtracking&lt;/em&gt;, un problema que puede dar lugar a un rendimiento muy bajo en ciertas expresiones regulares, que incluso puede ser explotado en ataques de denegación de servicio (DoS) en aplicaciones web.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Estos resultados son fácilmente explicables: la diferencia de rendimiento entre la primera y segunda opción es pequeña, porque la expresión regular es muy simple y, por tanto, el coste de su compilación es bajo. Pero el rendimiento se multiplica por tres en la tercera opción porque la ejecución de la expresión regular se beneficia de la compilación a código IL.&lt;/p&gt;
&lt;p&gt;Hasta aquí, hemos comprobado cómo realizando un par de modificaciones simples en el código podemos lograr mejorar considerablemente el rendimiento de las expresiones regulares en .NET. Pero aún hay más...&lt;/p&gt;
&lt;h2&gt;Tercera mejora: compilar la expresión regular en tiempo de diseño&lt;/h2&gt;
&lt;p&gt;La compilación de la expresión regular a código IL es una mejora muy interesante, pero tiene un coste adicional el términos de memoria y proceso, que se produce en el momento de la inicialización de la expresión regular, es decir, en tiempo de ejecución.&lt;/p&gt;
&lt;p&gt;De hecho, también podemos realizar un &lt;em&gt;benchmark&lt;/em&gt; del tiempo de creación de la instancia de &lt;code&gt;Regex&lt;/code&gt; con y sin compilación, y veremos que la diferencia es prácticamente del triple, tanto en tiempo de proceso como en consumo de memoria:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method              | Mean     | Error    | StdDev   | Gen0    | Gen1   | Allocated |
|-------------------- |---------:|---------:|---------:|--------:|-------:|----------:|
| CreateRegex         | 28.64 us | 0.204 us | 0.170 us |  3.4180 |      - |  29.27 KB |
| CreateRegexCompiled | 99.51 us | 0.973 us | 0.863 us | 10.7422 | 1.4648 |     90 KB |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si queremos evitar este sobrecoste, &lt;strong&gt;a partir de .NET 7 podemos compilar la expresión regular en tiempo de diseño&lt;/strong&gt; usando &lt;a href=&quot;https://www.variablenotfound.com/2021/03/c-source-generators-metaprogramacion-en.html&quot;&gt;source generators&lt;/a&gt;. De esta forma, el compilador de C# generará el código C# necesario para ejecutar la expresión regular, y lo incluirá en el ensamblado de la aplicación, por lo que no pagaremos ningún coste adicional en tiempo de ejecución. Pero además, como veremos algo más adelante, el código generado será mucho más eficiente que la versión compilada en tiempo de ejecución 🙂&lt;/p&gt;
&lt;p&gt;Para conseguirlo, en una clase cualquiera debemos un método parcial de tipo &lt;code&gt;Regex&lt;/code&gt; y asignarle el atributo &lt;code&gt;[GeneratedRegex]&lt;/code&gt; especificando el patrón de la expresión regular y las opciones que queramos utilizar. Por ejemplo, en el siguiente código podemos ver el método al que hemos llamado &lt;code&gt;GeneratedEmailRegex()&lt;/code&gt; sobre la clase estática parcial &lt;code&gt;EmailRegex&lt;/code&gt; (ambos nombres son arbitrarios):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public static partial class EmailRegex
{
    [GeneratedRegex(@&quot;^(?:[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;amp;&#39;*+/=?^_`{|}~-]+)*|&quot;&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$&quot;, RegexOptions.IgnoreCase)]
    public static partial Regex GeneratedEmailRegex();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Podéis ver fácilmente el código generado ejecutando la aplicación y, en el explorador de soluciones de Visual Studio, desplegando la carpeta &quot;External Sources&quot;, el ensamblado de la aplicación, y abriendo el archivo &lt;code&gt;RegexGenerator.g.cs&lt;/code&gt;, o bien, siguiendo &lt;a href=&quot;https://www.variablenotfound.com/2021/04/ver-el-codigo-fuente-generado-por.html&quot;&gt;estos pasos&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Una vez tenemos este método disponible, para utilizar la expresión regular simplemente debemos usar la instancia de &lt;code&gt;Regex&lt;/code&gt; retornada por el mismo, por ejemplo así:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public static class EmailValidator
{
    public static bool IsValid(string email)
    {
        return EmailRegex.GeneratedEmailRegex().IsMatch(email);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y si de nuevo nos llevamos estos cambios a BenchmarkDotNet, y medimos el rendimiento de las distintas implementaciones, de nuevo nos llevaremos una alegría:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method                    | Mean         | Error       | StdDev      | Gen0    | Allocated |
|-------------------------- |-------------:|------------:|------------:|--------:|----------:|
| IsValid_Initial           | 213,564.0 ns | 1,532.91 ns | 1,280.05 ns | 27.3438 |  233969 B |
| IsValid_Shared_Instance   |   2,667.7 ns |    39.86 ns |    35.33 ns |       - |         - |
| IsValid_Compiled_Instance |   2,745.5 ns |    37.81 ns |    35.37 ns |       - |         - |
| IsValid_UsingGenerators   |     788.3 ns |     7.91 ns |     7.40 ns |       - |         - |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¡Uau! De nuevo hemos conseguido dividir por tres el tiempo de ejecución de la expresión regular respecto a la versión compilada en tiempo de ejecución. Y bueno, si lo comparamos con la versión inicial, la que implementamos sin pensar en ninguna optimización, &lt;strong&gt;es cerca de 300 veces más eficiente&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;A veces, el código que escribimos puede no ser el más óptimo: a veces por costumbre, a veces por comodidad, u otras simplemente porque no conocemos fórmulas mejores. En algunos casos no importará demasiado porque quizás nuestros requisitos de rendimiento no son excesivamente exigentes, pero en otros muchos escenarios sí debemos prestar atención a este tipo de detalles.&lt;/p&gt;
&lt;p&gt;Lo que hemos visto en este post es un claro ejemplo de cómo las mejoras que se van introduciendo en el &lt;em&gt;framework&lt;/em&gt; y el SDK de .NET pueden ayudarnos a mejorar el rendimiento de nuestras aplicaciones con muy poco esfuerzo.&lt;/p&gt;


Publicado en: &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;www.variablenotfound.com&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7209680185522581744/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7209680185522581744' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7209680185522581744'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7209680185522581744'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/12/estas-usando-tus-expresiones-regulares.html' title='¿Estás usando tus expresiones regulares en .NET de forma óptima?'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHoWa6udoLNmUGPaPt3o5iG8pF3JDZCFvqnibpdEMvFG5NQj6PKRxGqAEGlA-2RrU-wvMZRFPcvybrEzxiEGV8JLBAAfR4x4CucUijwON1385EgGc6AwRWhMxMC7xIdAl4Tzd07IFEHbCFi3MDLUpNbTRu93c53V9fnycVlppmVZ5RYcSGfJBGrA/s72-c/regex.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-4763975484820582348</id><published>2025-12-15T08:42:00.001+01:00</published><updated>2026-01-16T19:01:05.388+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 631</title><content type='html'>&lt;img alt=&quot;Puesto de trabajo de desarrollador inquieto por la IA&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7K0gwQMUtzaN6o_gjGQ_jVmEKshV0KWBNaAKk369geXdYdsgFvy2NHZVloEPR60AxiIXZqPLlu043nmorEq0C9kF2-9zgOpszQ4b4ZWl4HQfC3q82tJID-yDtfTfzomK5vtqWox83_fQ_ziKq08iDPhDF2Xmp2_scuBgBhGQz-5p3jIIpcOZyA/s1600/ai-enemy-or-allied.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;La semana pasada estuve unos días fuera y no publiqué la habitual recopilación de los lunes. Pero ya me he puesto al día, y, como se me acumuló el trabajo, en esta entrega tenemos más de ¡100! enlaces a contenidos a los que vale la pena echar un vistazo.&lt;/p&gt;
&lt;p&gt;Por destacar algunos, en primer lugar el profundo análisis que está llevando a cabo Martin Stühmer sobre &lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-1-landscape/&quot; target=&quot;_blank&quot;&gt;soluciones de scheduling en .NET&lt;/a&gt;, muy interesantes para estar al tanto de las opciones disponibles.&lt;/p&gt;
&lt;p&gt;También Gerson Azabache ha publicado &lt;a href=&quot;https://bravedeveloper.com/&quot; target=&quot;_blank&quot;&gt;varios artículos interesantes sobre ASP.NET Core&lt;/a&gt;, como la comparativa entre Minimal APIs y controladores, resultados tipados y algunas buenas prácticas en el desarrollo de APIs empresariales.&lt;/p&gt;
&lt;p&gt;Braulio Díez comparte sus &lt;a href=&quot;https://elbraulio.net/posts/el-picar-se-va-a-acabar&quot;&gt;reflexiones y experiencias sobre el impacto de la IA&lt;/a&gt; en la programación y el futuro de los desarrolladores de software, que igual no es tan malo como algunos pintan.&lt;/p&gt;
&lt;p&gt;Y en la misma línea, José Manuel Alarcón habla sobre &lt;a href=&quot;https://www.campusmvp.es/recursos/post/aprende-a-programar-guia-practica-para-juniors-que-tienen-miedo-a-la-ia-o-no.aspx&quot; target=&quot;_blank&quot;&gt;cómo los juniors deben enfocar su proceso de aprendizaje&lt;/a&gt;, integrando la IA como una aliada imprescindible.&lt;/p&gt;
&lt;p&gt;Muchos más enlaces, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2018/11/mi-controlador-tiene-muchos-parametros.html&quot;&gt;Mi controlador tiene muchos parámetros en el constructor, ¿estoy haciendo algo mal?&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/10/hybridcache-la-nueva-cache-hibrida-de.html&quot;&gt;HybridCache, la nueva caché híbrida de .NET 9&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/what-we-think/talks/csharp-14-new-feature-field-backed-properties&quot;&gt;C# 14 New Feature: Field-Backed Properties&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/recent-updates-to-netescapaades-enumgenerators/&quot;&gt;Recent updates to NetEscapades.EnumGenerators: [EnumMember] support, analyzers, and bug fixes&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jeremydmiller.com/2025/12/04/classic-net-domain-events-with-wolverine-and-ef-core/&quot;&gt;“Classic” .NET Domain Events with Wolverine and EF&amp;nbsp;Core&lt;/a&gt;&lt;br /&gt;
Jeremy D. Miller&lt;/li&gt;
&lt;li&gt;.NET Job Scheduling: &lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-3-quartznet/&quot;&gt;Quartz.NET for Enterprise Scale&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-4-coravel/&quot;&gt;Coravel and Fluent Simplicity&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-5-ncronjob/&quot;&gt;NCronJob and Native Minimalism&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-6-tickerq/&quot;&gt;TickerQ and Modern Architecture&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/how-to-build-a-production-ready-invoice-builder-in-dotnet-using-ironpdf&quot;&gt;How to Build a Production-Ready Invoice Builder in .NET Using IronPDF&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20251205-00/?p=111843&quot;&gt;How can my process read its own standard output?&lt;/a&gt;&lt;br /&gt;
Raymond Chen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/8f41d316-f6ac-4712-bf11-ea36b7c2f2e6&quot;&gt;Mime Type Helper in .NET 11&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ardalis.com/single-file-tests-in-dotnet-csharp/&quot;&gt;Single File Test Suites in Dotnet Csharp&lt;/a&gt;&lt;br /&gt;
Steve Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamlor.info/posts-output/2025-12-02-just-in-time-types-and-cecilifier/en/&quot;&gt;Create Types on Demand and Cecilifier&lt;/a&gt;&lt;br /&gt;
Roman Stoffel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/creating-a-custom-msbuild-sdk-to-reduce-boilerplate-in-dotnet-projects.htm&quot;&gt;Creating a custom MSBuild SDK to reduce boilerplate in .NET projects&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stephencleary.com/2025/12/debug-dumps-in-visual-studio.html&quot;&gt;Debug Dumps in Visual Studio&lt;/a&gt;&lt;br /&gt;
Stephen Cleary&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sipkeschoorstra.medium.com/building-modular-net-applications-with-cshells-521782089a0b&quot;&gt;Building Modular .NET Applications with CShells&lt;/a&gt;&lt;br /&gt;
Sipke Schoorstra&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-10-networking-improvements/&quot;&gt;.NET 10 Networking Improvements&lt;/a&gt;&lt;br /&gt;
Marie Píchová&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2025/Dec/08/What-the-heck-is-a-nul-path-and-why-is-it-breaking-my-Directory-Files-Lookup&quot;&gt;What the heck is a &lt;code&gt;\\.\nul&lt;/code&gt; path and why is it breaking my Directory Files Lookup?&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2025/12/net-10-validation.html&quot;&gt;.NET 10 Validation&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trailheadtechnology.com/net-performance-efficient-async-code/&quot;&gt;.NET Performance: Efficient Async Code&lt;/a&gt;&lt;br /&gt;
Nick Kovalenko&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/educatordeveloperblog/-net-10-and-memory-less-heap-smarter-gc-faster-apps/4474165&quot;&gt;.NET 10 and Memory: Less Heap, Smarter GC, Faster Apps&lt;/a&gt;&lt;br /&gt;
Hazem Ali&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnettips.wordpress.com/2025/12/07/immutable-collection-add-trap-dont-get-burned-use-a-builder-instead/&quot;&gt;Immutable Collection Add() Trap: Don’t Get Burned — Use a Builder&amp;nbsp;Instead&lt;/a&gt;&lt;br /&gt;
David McCarter&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/2025/12/how-dotnet-10-boosted-ais-dotnet-performance-by-7-percent-for-free&quot;&gt;How .NET 10.0 boosted AIS.NET performance by 7%&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/resolving-overload-ambiguity-with-collection-expressions.htm&quot;&gt;Resolving Overload Ambiguity with Collection Expressions&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typemock.com/typemock-architecture-dotnet-isolator-engine/&quot;&gt;Typemock Architecture: Inside the .NET Isolator Engine (Part 2)&lt;/a&gt;&lt;br /&gt;
Eli Lopian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/write-cleaner-code-csharp-14-null-conditional-assignment-operator&quot;&gt;Cleaner Code: C# 14 Null-Conditional Assignment Operator&lt;/a&gt;&lt;br /&gt;
Dave Brock&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2025/11/23/minimal-apis-vs-controllers-en-net-10-la-guia-corta-y-honesta/&quot;&gt;Minimal APIs vs Controllers en .NET 10: la guía corta y honesta&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://bravedeveloper.com/2025/12/07/por-que-tus-apis-en-net-deberian-usar-result-contracts-typed-results/&quot;&gt;Por qué tus APIs en .NET deberían usar Result Contracts (Typed Results)&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://bravedeveloper.com/2025/11/30/las-5-mejores-practicas-modernas-para-apis-empresariales-en-net-2026/&quot;&gt;Las 5 mejores prácticas modernas para APIs empresariales en .NET (2026)&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/enterprise-patterns-for-asp-net-core-minimal-api-transaction-script-pattern-the-shortcut-that-quietly-reshapes-your-system/&quot;&gt;Enterprise Patterns for ASP.NET Core Minimal API: Transaction Script Pattern – The Shortcut That Quietly Reshapes Your System&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/how-to-upload-files-asp-net-core-web-api&quot;&gt;How to upload files in an ASP.NET Core Web API&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/stop-letting-your-controllers-talk-to-sql-layered-architecture-in-asp-net-core/&quot;&gt;Stop Letting Your Controllers Talk to SQL: Layered Architecture in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/best-practices-for-building-rest-apis&quot;&gt;Best Practices For Building REST APIs&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/blazor-dropdown-component-guide&quot;&gt;How to Choose the Best Blazor Dropdown Component for Your Web App&lt;/a&gt;&lt;br /&gt;
Prince Oliver&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/minimalblog-introduction&quot;&gt;mostlylucid.MinimalBlog - How Simple Can an ASP.NET Blog Really Be? (English)&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/enterprise-patterns-for-asp-net-core-minimal-api-domain-model-pattern-when-your-core-rules-deserve-their-own-gravity/&quot;&gt;Enterprise Patterns for ASP.NET Core Minimal API: Domain Model Pattern – When Your Core Rules Deserve Their Own Gravity&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;Load Testing ASP.NET Core Applications with k6: &lt;a href=&quot;https://www.mostlylucid.net/blog/k6-testing-introduction&quot;&gt;Introduction&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.mostlylucid.net/blog/k6-testing-practical&quot;&gt;Practical Implementation&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.safia.rocks/2025/12/08/aspire-docker-compose/&quot;&gt;How Aspire composes itself: an overview of Aspire&#39;s Docker Compose integration&lt;/a&gt;&lt;br /&gt;
Safia Abdalla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorise.com/blog/migrating-from-bootstrap-blazor-or-mudblazor-to-blazorise&quot;&gt;Migrating from Bootstrap Blazor or MudBlazor to Blazorise&lt;/a&gt;&lt;br /&gt;
Mladen Macanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/using-strategy-pattern-with-dependency-injection-in-asp-net-core/&quot;&gt;Using Strategy Pattern with Dependency Injection in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chris-ayers.com/2025/12/11/aspire-cli-getting-started/&quot;&gt;Getting Started with the Aspire CLI - A Complete Guide&lt;/a&gt;&lt;br /&gt;
Chris Ayers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.shankuehn.io/post/you-can-t-use-azure-migrate-to-move-between-tenants-even-if-you-try-to-run-it-in-azure&quot;&gt;You Can&#39;t Use Azure Migrate to Move Between Tenants (Even if you Try to Run it in Azure)&lt;/a&gt;&lt;br /&gt;
Shannon B. Kuehn&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/deploy-a-spreadsheet-server-azure-app&quot;&gt;How to Deploy a Spreadsheet Server on Azure App Service Using Visual Studio and Docker&lt;/a&gt;&lt;br /&gt;
Parthasarathy Ranjan&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/domain-driven-design-misconceptions/&quot;&gt;Domain-Driven Design Misconceptions&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ploeh.dk/2025/12/01/treat-test-code-like-production-code/&quot;&gt;Treat test code like production code&lt;/a&gt;&lt;br /&gt;
Mark Seemann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/aggregates-in-ddd-model-rules-not-relationships/&quot;&gt;Aggregates in DDD: Model Rules, Not Relationships&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://levelup.gitconnected.com/10-habits-that-make-you-a-great-programmer-f5fd5686d80f&quot;&gt;10 Habits That Make You a Great Programmer&lt;/a&gt;&lt;br /&gt;
Shalitha Suranga&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/12-essential-distributed-system-design-patterns-every-architect-should-know&quot;&gt;12 Essential Distributed System Design Patterns Every Architect Should Know&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-power-of-ten-rules/&quot;&gt;Power of Ten Rules: More Relevant Than Ever for .NET&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thatamazingprogrammer.com/posts/stop-naming-your-variables-flag-the-art-of-boolean-prefixes/&quot;&gt;Stop Naming Your Variables &quot;Flag&quot;: The Art of Boolean Prefixes&lt;/a&gt;&lt;br /&gt;
Christopher Johnson&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Data Access in .NET: &lt;a href=&quot;https://www.mostlylucid.net/blog/orm-mapping-comparison-part1&quot;&gt;Comparing ORMs and Mapping Strategies (Part 1&lt;/a&gt; &amp;amp; * &lt;a href=&quot;https://www.mostlylucid.net/blog/orm-mapping-comparison-part2&quot;&gt;Comparing ORMs and Mapping Strategies (Part 2&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://woodruff.dev/debugging-entity-framework-core-8-real-world-query-anti-patterns-and-how-to-fix-them/&quot;&gt;Debugging Entity Framework Core: 8 Real-World Query Anti‑Patterns (and How to Fix Them)&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timdeschryver.dev/blog/named-global-query-filters-in-entity-framework-core-10&quot;&gt;Named global query filters in Entity Framework Core 10&lt;/a&gt;&lt;br /&gt;
Tim Deschryver&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/dbcontext-is-not-thread-safe-parallelizing-ef-core-queries-the-right-way&quot;&gt;DbContext is Not Thread-Safe: Parallelizing EF Core Queries the Right Way&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/why-your-ef-core-queries-slow-how-to-fix-them&quot;&gt;Why your EF Core queries are slow and how to fix them&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://eurollm.io/&quot;&gt;Meet EuroLLM: Large language model made in Europe built to support all official 24 EU languages&lt;/a&gt;&lt;br /&gt;
EuroLLM&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mistral.ai/news/devstral-2-vibe-cli&quot;&gt;Introducing: Devstral 2 and Mistral Vibe CLI&lt;/a&gt;&lt;br /&gt;
Mistral&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-2/&quot;&gt;Introducing GPT-5.2&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2025/12/01/introducing-the-microsoft-agent-framework-a-dev-friendly-recap/&quot;&gt;Introducing the Microsoft Agent Framework – A Dev-Friendly Recap&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/introducing-data-ingestion-building-blocks-preview/&quot;&gt;Introducing Data Ingestion Building Blocks (Preview)&lt;/a&gt;&lt;br /&gt;
Luis Quintanilla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2025/12/01/anomaly-detection-using-k-means-clustering-with-javascript.aspx&quot;&gt;Anomaly Detection Using K-Means Clustering with JavaScript&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2025/12/como-desplegar-una-aplicacion-con-vue-en-github-pages/&quot;&gt;Cómo probar tu aplicación con Vue en GitHub Pages&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/prevent-a-page-from-scrolling-while-a-dialog-is-open/&quot;&gt;Prevent a page from scrolling while a dialog is open&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/getting-creative-with-the-measure/&quot;&gt;Getting Creative With “The Measure”&lt;/a&gt;&lt;br /&gt;
Andy Clarke&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/scrollytelling-on-steroids-with-scroll-state-queries/&quot;&gt;Scrollytelling on Steroids With Scroll-State Queries&lt;/a&gt;&lt;br /&gt;
Lee Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2025/12/masonry-things-you-wont-need-library-anymore/&quot;&gt;Masonry: Things You Won’t Need A Library For Anymore&lt;/a&gt;&lt;br /&gt;
Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frederikbraun.de/why-sethtml.html&quot;&gt;Frederik Braun: Why the Sanitizer API is just &lt;code&gt;setHTML()&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
Frederik Braun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/creating-scroll-based-animations-in-full-view/&quot;&gt;Creating Scroll-Based Animations&amp;nbsp;in Full view()&lt;/a&gt;&lt;br /&gt;
Preethi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.dev/css-wrapped-2025/&quot;&gt;CSS Wrapped 2025&lt;/a&gt;&lt;br /&gt;
Chrome DevRel Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/fit-width-text-in-1-line-of-css/&quot;&gt;Fit width text in 1 line of CSS&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/that-time-i-tried-explaining-html-and-css-to-my-5-year-old-niece/&quot;&gt;That Time I Tried Explaining HTML and CSS to My 5-Year Old Niece&lt;/a&gt;&lt;br /&gt;
Kevine Nzapdi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/17628/target-text-an-easy-way-to-style-text-fragments/&quot;&gt;::target-text: An easy way to style text fragments&lt;/a&gt;&lt;br /&gt;
Saron Yitbarek&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/stop-using-js-for-css/&quot;&gt;Stop using JavaScript to solve CSS problems&lt;/a&gt;&lt;br /&gt;
Chizaram Ken&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewthecoder.com/blog/javascript-enigma-machine&quot;&gt;Simulating the Enigma Machine&lt;/a&gt;&lt;br /&gt;
Andrew S. Erwin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cekrem.github.io/posts/tailwind-targeting-child-elements/&quot;&gt;Tailwind CSS: Targeting Child Elements (when you have to)&lt;/a&gt;&lt;br /&gt;
Christian Ekrem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/react-rich-text-editor-xss-prevention&quot;&gt;How to Prevent XSS Attacks in React Rich Text Editor&lt;/a&gt;&lt;br /&gt;
Thangavel E.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.htmhell.dev/adventcalendar/2025/8/&quot;&gt;What&#39;s wrong with this HTML, and is it valid?&lt;/a&gt;&lt;br /&gt;
Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/how-create-liquid-glass-effects-css-and-svg/&quot;&gt;How to create Liquid Glass effects with CSS and SVG&lt;/a&gt;&lt;br /&gt;
Rahul Chhodde&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/what-else-could-container-queries-query/&quot;&gt;What Else Could Container Queries... Query?&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot;&gt;Denial of Service and Source Code Exposure in React Server Components – React&lt;/a&gt;&lt;br /&gt;
The React Team&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/why-changing-keyboard-shortcuts-in-visual-studio-isnt-as-simple-as-it-seems/&quot;&gt;Why changing keyboard shortcuts in Visual Studio isn’t as simple as it seems&lt;/a&gt;&lt;br /&gt;
Steven Miller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build5nines.com/unlock-github-copilots-full-potential-why-every-repo-needs-an-agents-md-file/&quot;&gt;Unlock GitHub Copilot’s Full Potential: Why Every Repo Needs an AGENTS.md File&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/progress-on-typescript-7-december-2025/&quot;&gt;Progress on TypeScript 7 - December 2025&lt;/a&gt;&lt;br /&gt;
Daniel Rosenwasser&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.blog/2025/12/02/introducing-stack-overflow-ai-assist-a-tool-for-the-modern-developer/&quot;&gt;Introducing Stack Overflow AI Assist—a tool for the modern developer&lt;/a&gt;&lt;br /&gt;
Stack Overflow Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/microsoft-learn-mcp-server-elevates-development/&quot;&gt;Microsoft Learn MCP Server Elevates Development&lt;/a&gt;&lt;br /&gt;
Wendy Breiding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/trying-out-the-zed-editor-on-windows-for-dotnet-and-markdown/&quot;&gt;Trying out the Zed editor on Windows for .NET and Markdown&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/jsts-modernizer-preview&quot;&gt;Previewing the JavaScript/TypeScript Modernizer for VS Code Insiders&lt;/a&gt;&lt;br /&gt;
Sayed Ibrahim Hashimi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://safedep.io/dark-gpt-vscode-malicious-extension/&quot;&gt;DarkGPT: Malicious Visual Studio Code Extension Targeting Developers — Real-time Open Source Software Supply Chain Security&lt;/a&gt;&lt;br /&gt;
SafeDep Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/streamlining-your-git-workflow-with-visual-studio-2026/&quot;&gt;Streamlining your Git workflow with Visual Studio 2026&lt;/a&gt;&lt;br /&gt;
Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/making-windows-terminal-awesome-with-github-copilot-cli&quot;&gt;Making Windows Terminal awesome with GitHub Copilot CLI&lt;/a&gt;&lt;br /&gt;
Linda Berns&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI / Cross-Platform&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/cross-platform-age-verification-dotnet-maui/&quot;&gt;Cross-Platform Age Verification in .NET MAUI Applications&lt;/a&gt;&lt;br /&gt;
Gerald Versluis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/securing-sensitive-mobile-operations-with-device-bound-request-signing&quot;&gt;Securing Sensitive Mobile Operations with Device-Bound Request Signing&lt;/a&gt;&lt;br /&gt;
Fernando de Oliveira&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/mastering-popups-in-dotnet-maui-apps&quot;&gt;Mastering Popups in .NET MAUI: Alerts, Action Sheets, Overlays &amp;amp; More&lt;/a&gt;&lt;br /&gt;
Jayaleshwari N.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/cross-platform-billing-dotnet-maui/&quot;&gt;Implementing Cross-Platform In-App Billing in .NET MAUI Applications&lt;/a&gt;&lt;br /&gt;
Gerald Versluis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/add-and-remove-digital-signatures-in-pdf&quot;&gt;How to Add and Remove Digital Signatures in PDF Using .NET MAUI&lt;/a&gt;&lt;br /&gt;
Rangarajan Ashokan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/google-maps-in-dotnet-maui&quot;&gt;How to Integrate Google Maps in .NET MAUI: A Cross-Platform Guide Using the Google Maps Tile API&lt;/a&gt;&lt;br /&gt;
Jeyasri Murugan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://avaloniaui.net/blog/avalonia-maui-progress-update&quot;&gt;Avalonia MAUI Progress Update&lt;/a&gt;&lt;br /&gt;
Tim Miller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/net-10-quick-ui-changes-worth-noticing-net-maui&quot;&gt;.NET 10: Quick UI Changes Worth Noticing in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://elbraulio.net/posts/el-picar-se-va-a-acabar&quot;&gt;El picar se va acabar&lt;/a&gt;&lt;br /&gt;
Braulio Díez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/aprende-a-programar-guia-practica-para-juniors-que-tienen-miedo-a-la-ia-o-no.aspx&quot;&gt;Aprende a programar en 2026: guía práctica para juniors (que tienen miedo a la IA, o no)&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/4763975484820582348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/4763975484820582348' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4763975484820582348'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4763975484820582348'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/12/enlaces-interesantes-631.html' title='Enlaces interesantes 631'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7K0gwQMUtzaN6o_gjGQ_jVmEKshV0KWBNaAKk369geXdYdsgFvy2NHZVloEPR60AxiIXZqPLlu043nmorEq0C9kF2-9zgOpszQ4b4ZWl4HQfC3q82tJID-yDtfTfzomK5vtqWox83_fQ_ziKq08iDPhDF2Xmp2_scuBgBhGQz-5p3jIIpcOZyA/s72-c/ai-enemy-or-allied.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7675381923666319789</id><published>2025-12-02T08:05:00.018+01:00</published><updated>2025-12-02T08:05:00.117+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aspnetcore"/><category scheme="http://www.blogger.com/atom/ns#" term="novedades"/><title type='text'>Soporte para el TLD .localhost en ASP.NET Core 10</title><content type='html'>&lt;img alt=&quot;Desarrollador trabajando en una aplicación web&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1wOWsc0czUErzh180GiM027UXwCxT3Kekiuo03wPEFQnStaUfACmhttRn2GCStugFIyTcF6_0QXHkN_vlpP9vuw1v1r30ufNSZ3kFuZmJnD0v7CqtjaUW91xFcL36x_DCZRummKyM0f989JIlzqYL8ozWNuoCOg7DAqrHuMb3qJI-o5TlF6gT7A/s800/tld-localhost-net-10.jpg&quot; width=&quot;100%&quot; /&gt;


&lt;p&gt;Al desarrollar aplicaciones ASP.NET Core (APIs, MVC, Razor Pages o Blazor) y ejecutarlas en local, ya sabes que todas ellas comparten el mismo nombre de &lt;em&gt;host&lt;/em&gt;: &lt;code&gt;localhost&lt;/code&gt;, y lo único que las diferencia es el puerto en el que se encuentran a la escucha.&lt;/p&gt;
&lt;p&gt;Esto puede dar lugar a ciertos problemas. Aparte de no ser sencillo identificarlas a partir de la URL mostrada en el navegador, hay ciertos recursos web que pueden mezclarse entre proyectos (por ejemplo, las &lt;em&gt;cookies&lt;/em&gt;) y pueden dar lugar a comportamientos inesperados.&lt;/p&gt;
&lt;p&gt;En ASP.NET Core 10 se ha puesto solución a esto añadiendo el soporte para el TLD (Top Level Domain) &lt;code&gt;.localhost&lt;/code&gt;, lo que permite que cada aplicación pueda tener su propio nombre de &lt;em&gt;host&lt;/em&gt; único.&lt;/p&gt;
&lt;p&gt;Lo vemos a continuación.&lt;/p&gt;
&lt;h2&gt;Soporte para TLD .localhost en ASP.NET Core 10&lt;/h2&gt;
&lt;p&gt;El nombre &lt;code&gt;.localhost&lt;/code&gt; es un dominio de nivel superior (TLD, &lt;em&gt;Top Level Domain&lt;/em&gt;) reservado por las &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2606&quot;&gt;RFC 2606&lt;/a&gt; y &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6761&quot;&gt;6761&lt;/a&gt; para ser utilizado en entornos de desarrollo y pruebas, y siempre está asociado a la dirección de &lt;em&gt;loopback&lt;/em&gt;, es decir, a la dirección local del propio equipo.&lt;/p&gt;
&lt;p&gt;Por tanto, cualquier nombre de &lt;em&gt;host&lt;/em&gt; que termine en &lt;code&gt;.localhost&lt;/code&gt; (por ejemplo, &lt;code&gt;miapp.localhost&lt;/code&gt;, &lt;code&gt;api.localhost&lt;/code&gt;, &lt;code&gt;MyApp.dev.localhost&lt;/code&gt;, etc.) debería resolverse siempre a la dirección IP &lt;code&gt;127.0.0.1&lt;/code&gt; o &lt;code&gt;::1&lt;/code&gt;, dependiendo de si se utiliza IPv4 o IPv6.&lt;/p&gt;
&lt;p&gt;A partir de ASP.NET Core 10, Kestrel entenderá que todos los nombres de &lt;em&gt;host&lt;/em&gt; que terminen en &lt;code&gt;.localhost&lt;/code&gt; son alias válidos para &lt;code&gt;localhost&lt;/code&gt;, por lo que podemos utilizarlos para configurar el servidor, definir las URLs de nuestras aplicaciones (tanto en &lt;code&gt;launchSettings.json&lt;/code&gt; como en variables de entorno), etc. Esto nos permitirá &lt;strong&gt;usar distintos nombres de &lt;em&gt;host&lt;/em&gt; para cada aplicación&lt;/strong&gt;, evitando los problemas mencionados anteriormente.&lt;/p&gt;
&lt;p&gt;Otro tema que han actualizado es el certificado HTTPS utilizado en desarrollo. Dado que el antiguo certificado solo era válido para &lt;code&gt;localhost&lt;/code&gt;, al utilizar otros nombres de &lt;em&gt;host&lt;/em&gt; el navegador mostraría advertencias de seguridad. Por esta razón, el certificado que se registra al instalar .NET 10 es un &lt;em&gt;wildcard&lt;/em&gt; del dominio &lt;code&gt;*.dev.localhost&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Observad que no han podido hacerlo directamente para soportar &lt;code&gt;*.localhost&lt;/code&gt;.  Han tenido que introducir el subdominio &lt;code&gt;.dev&lt;/code&gt; por delante porque no es posible crear &lt;em&gt;wildcards&lt;/em&gt; sobre &lt;em&gt;top level domains&lt;/em&gt; como &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En la práctica, esto implica que podremos asignar a nuestras aplicaciones ASP.NET Core nombres de &lt;em&gt;host&lt;/em&gt; como &lt;code&gt;miapp.dev.localhost&lt;/code&gt;, &lt;code&gt;api.dev.localhost&lt;/code&gt;, etc., aunque no es algo que esté habilitado por defecto.&lt;/p&gt;
&lt;p&gt;Para activar esta característica, &lt;strong&gt;debemos seleccionar la opción &quot;Use the .dev.localhost TLD in the application URL&quot; al crear una nueva aplicación&lt;/strong&gt;, como se muestra en la siguiente imagen:&lt;/p&gt;
&lt;p&gt;
  &lt;img alt=&quot;Pantalla de creación de una aplicación ASP.NET Core, seleccionando el uso del TLD .dev.localhost&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbvFtAyWrSu5iqCEiTT6WRkg5J3bjhE8ramHD_PwODKeTBi5DcdGD20okr33ace20XRl-yrpSWRgWolj18D93WMwbeJcByAx0Rtf55YCUGpyd8aarFSaAq-P0Wa2ah58o6k3SKHJipXZ8lQghLuqjmZi9j0VGmH3PvzX1c7yLWhiqUNA7mbUuVzQ/s650/dev.localhost.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;Al hacerlo, se configurará el &lt;code&gt;launchsettings.json&lt;/code&gt; para que utilice el nombre de proyecto como subdominio. Por ejemplo, a continuación se muestra la configuración generada para el proyecto &lt;code&gt;MyWebApplication&lt;/code&gt;, donde podemos ver el uso del &lt;em&gt;host&lt;/em&gt; &lt;code&gt;mywebapplication.dev.localhost&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;$schema&quot;: &quot;https://json.schemastore.org/launchsettings.json&quot;,
  &quot;profiles&quot;: {
    &quot;http&quot;: {
      &quot;commandName&quot;: &quot;Project&quot;,
      &quot;dotnetRunMessages&quot;: true,
      &quot;launchBrowser&quot;: true,
      &quot;applicationUrl&quot;: &quot;http://mywebapplication.dev.localhost:5244&quot;,
      &quot;environmentVariables&quot;: {
        &quot;ASPNETCORE_ENVIRONMENT&quot;: &quot;Development&quot;
      }
    },
    &quot;https&quot;: {
      &quot;commandName&quot;: &quot;Project&quot;,
      &quot;dotnetRunMessages&quot;: true,
      &quot;launchBrowser&quot;: true,
      &quot;applicationUrl&quot;: &quot;https://mywebapplication.dev.localhost:7279;
                         http://mywebapplication.dev.localhost:5244&quot;,
      &quot;environmentVariables&quot;: {
        &quot;ASPNETCORE_ENVIRONMENT&quot;: &quot;Development&quot;
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;También &lt;strong&gt;podemos conseguir lo mismo si utilizamos la línea de comandos&lt;/strong&gt; de .NET para crear los proyectos. Por ejemplo, el siguiente comando crea una aplicación MVC que utiliza el TLD &lt;code&gt;.dev.localhost&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;C:\MyProjects\MyWebApp&amp;gt;dotnet new web --localhost-tld
The template &quot;ASP.NET Core Empty&quot; was created successfully.

Processing post-creation actions...
Restoring C:\MyProjects\MyWebApp\MyWebApp.csproj:
Restore succeeded.


C:\MyProjects\MyWebApp&amp;gt;type .\Properties\launchSettings.json
{
  &quot;$schema&quot;: &quot;https://json.schemastore.org/launchsettings.json&quot;,
  &quot;profiles&quot;: {
    &quot;http&quot;: {
      &quot;commandName&quot;: &quot;Project&quot;,
      &quot;dotnetRunMessages&quot;: true,
      &quot;launchBrowser&quot;: true,
      &quot;applicationUrl&quot;: &quot;http://mywebapp.dev.localhost:5024&quot;,
      &quot;environmentVariables&quot;: {
        &quot;ASPNETCORE_ENVIRONMENT&quot;: &quot;Development&quot;
      }
    },
    &quot;https&quot;: {
      &quot;commandName&quot;: &quot;Project&quot;,
      &quot;dotnetRunMessages&quot;: true,
      &quot;launchBrowser&quot;: true,
      &quot;applicationUrl&quot;: &quot;https://mywebapp.dev.localhost:7125;
                         http://mywebapp.dev.localhost:5024&quot;,
      &quot;environmentVariables&quot;: {
        &quot;ASPNETCORE_ENVIRONMENT&quot;: &quot;Development&quot;
      }
    }
  }
}
C:\MyProjects\MyWebApp&amp;gt;_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Con estas configuraciones, al lanzar el proyecto se utilizarán estos nombres de &lt;em&gt;host&lt;/em&gt; exclusivos para el proyecto, evitando los problemas de compartir el mismo &lt;code&gt;localhost&lt;/code&gt; entre varias aplicaciones.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;C:\MyProjects\MyWebApp&amp;gt; dotnet run
Using launch settings from C:\MyProjects\MyWebApp\Properties\launchSettings.json...
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://mywebapp.dev.localhost:5024
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5024
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\MyProjects\MyWebApp
_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un último detalle importante: &lt;strong&gt;podremos utilizar los nombres de &lt;em&gt;host&lt;/em&gt; personalizados cuando accedamos a las aplicaciones desde el navegador web&lt;/strong&gt;, pero probablemente no desde otras herramientas como &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;Postman&lt;/code&gt;, etc., o al menos de directamente.&lt;/p&gt;
&lt;p&gt;Esto se debe a que, aunque el TLD &lt;code&gt;.localhost&lt;/code&gt; está reservado para este propósito, &lt;strong&gt;no todas las aplicaciones cliente o los sistemas operativos resuelven automáticamente estos nombres a la dirección de &lt;em&gt;loopback&lt;/em&gt;&lt;/strong&gt;. Por esta razón, en estos casos tendríamos que añadir entradas manuales en el archivo &lt;code&gt;hosts&lt;/code&gt; de nuestro sistema operativo para que los nombres personalizados funcionen correctamente.&lt;/p&gt;
&lt;p&gt;Afortunadamente, los navegadores web modernos implementan esta resolución de forma automática, por lo que funcionará directamente 🙂&lt;/p&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/7675381923666319789/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7675381923666319789' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7675381923666319789'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7675381923666319789'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/12/soporte-para-el-tld-localhost-en-aspnet.html' title='Soporte para el TLD .localhost en ASP.NET Core 10'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1wOWsc0czUErzh180GiM027UXwCxT3Kekiuo03wPEFQnStaUfACmhttRn2GCStugFIyTcF6_0QXHkN_vlpP9vuw1v1r30ufNSZ3kFuZmJnD0v7CqtjaUW91xFcL36x_DCZRummKyM0f989JIlzqYL8ozWNuoCOg7DAqrHuMb3qJI-o5TlF6gT7A/s72-c/tld-localhost-net-10.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-2587375959938999299</id><published>2025-12-01T08:01:00.030+01:00</published><updated>2025-12-01T08:01:00.115+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 630</title><content type='html'>&lt;img alt=&quot;Un usuario caminando feliz por el happy path&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeeEv-cA2ebptUo3AwG6Tw_B7aoZ_STVibFg13pMYjxDq6e_QRjZ-qr4uQoVnfc9MbQ8_ASbhp3yKQ61XG2UW4n4OXA7ane3i2uOOYhVfBkqsI2SolTOBNHOS8yMJRE0nZ5h5J1edSISs1-yNf8Lw74yzDBkeJ6yAEKPR7Tfrq3GkyQ1W5hMZwvA/s800/happy-path.jpg&quot;  width=&quot;100%&quot; loading=&quot;lazy&quot; /&gt;


&lt;p&gt;Esta semana me gustaría destacar en primer lugar el detallado análisis de Andrew Lock sobre &lt;a href=&quot;https://andrewlock.net/exploring-the-dotnet-boot-process-via-host-tracing/&quot; target=&quot;_blank&quot;&gt;el proceso de arranque de una aplicación .NET&lt;/a&gt;, muy interesante para saber cómo funcionan las cosas por dentro.&lt;/p&gt;
&lt;p&gt;Bipin Joshi da un &lt;a href=&quot;https://www.binaryintellect.net/articles/f23506c0-2f40-4dd9-9959-524ca71271d8aspx&quot; target=&quot;_blank&quot;&gt;gran repaso a Kestrel&lt;/a&gt;, el motor de todas las aplicaciones ASP.NET Core: cómo configurarlo, tunearlo, ejecutarlo y buenas prácticas de uso.&lt;/p&gt;
&lt;p&gt;Milan Jovanović nos recuerda que el &lt;i&gt;happy path&lt;/i&gt; no es el único camino en nuestras aplicaciones, y nos muestra &lt;a href=&quot;https://www.milanjovanovic.tech/blog/the-false-comfort-of-the-happy-path-decoupling-your-services&quot; target=&quot;_blank&quot;&gt;técnicas para desacoplar servicios para hacerlos más robustos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por último, Ricardo Peres nos habla de &lt;a href=&quot;https://developmentwithadot.blogspot.com/2025/11/nullable-and-required-typeshtml&quot; target=&quot;_blank&quot;&gt;la relación entre tipos anulables y miembros requeridos en C#&lt;/a&gt;, algo que, cuando empezamos a trabajar con ellos, puede resultar algo confuso.&lt;/p&gt;
&lt;p&gt;El resto de enlaces, a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/10/soporte-para-colecciones-en-parametros.html&quot;&gt;Soporte para colecciones en parámetros &lt;code&gt;param&lt;/code&gt; de .NET 9&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2018/11/establecer-textos-por-defecto-y.html&quot;&gt;Establecer textos por defecto y localizados en validaciones de ASP.NET Core MVC&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@thomhurst/tunit-why-i-spent-2-years-building-a-new-net-testing-framework-86efaec0b8b8&quot;&gt;TUnit — Why I Spent 2 Years Building a New .NET Testing Framework&lt;/a&gt;&lt;br /&gt;
Tom Longhurst&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anthonygiretti.com/2025/11/23/c-14-user-defined-compound-assignment-operators/&quot;&gt;C# 14: User-Defined Compound Assignment Operators&lt;/a&gt;&lt;br /&gt;
Anthony Giretti&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/backpressure-queueing-systems&quot;&gt;Under Pressure: How Queueing Systems Handle Backpressure with Examples in C#&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/csharp/precision-handling-money-time-ranges/&quot;&gt;Precision Matters in C#: Correctly Handling Money, Time Zones, and Date Ranges&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/exploring-the-dotnet-boot-process-via-host-tracing/&quot;&gt;Exploring the .NET boot process via host tracing&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-1-landscape/&quot;&gt;.NET Job Scheduling — The Landscape&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/why-do-you-need-to-write-architecture-tests-in-dotnet&quot;&gt;Why Do You Need To Write Architecture Tests in .NET&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/fetching-github-content-from-c/&quot;&gt;Fetching GitHub content from C#&lt;/a&gt;&lt;br /&gt;
Thomas Ardal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/using-csx-for-testing#net-10-file-based-apps-now-available&quot;&gt;Using CSX Scripts for Quick C# Testing (English)&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://petabridge.com/blog/akka-net-tls-vulnerability/&quot;&gt;The Worst Security Vulnerability in Akka.NET&lt;/a&gt;&lt;br /&gt;
Aaron Stannard&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://josef.codes/idistributedcache-redis-remove-by-prefix/&quot;&gt;IDistributedCache (Redis)&lt;/a&gt;&lt;br /&gt;
Josef Ottosson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/adding-intelligence-blazor-apps-using-telerik-smart-components&quot;&gt;Adding Intelligence to Blazor with Telerik Smart Components&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/c-sharp-typescript-knowledge/&quot;&gt;How to ensure your expert C# knowledge doesn&#39;t make you a TypeScript noob&lt;/a&gt;&lt;br /&gt;
Lewis Cianci&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/2025/11/ix-v7-dotnet-10-linq-iasyncenumerable&quot;&gt;Ix.NET v7.0: .NET 10 and LINQ for IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/practical-design/building-real-time-hybrid-recommendations/&quot;&gt;Real-Time Recommendation Engines in .NET: Hybrid Retrieval, Deep Learning, and Vector Search&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2025/11/one-shot-tool-execution-in-net-10-run.html&quot;&gt;One shot tool execution in .NET 10&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-job-scheduling-2-hangfire/&quot;&gt;.NET Job Scheduling — Hangfire and Persistent Reliability&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2025/11/nullable-and-required-types.html&quot;&gt;Nullable and Required Types&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/httpclient-testing-without-mocks&quot;&gt;Unit Testing HttpClient WITHOUT Mocks&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2025/11/multitenancy-techniques-for-ui-in.html&quot;&gt;Multitenancy Techniques for the UI in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-blog/why-you-must-use-minimal-apis-over-controllers-new-apps&quot;&gt;Why you must use Minimal APIs over Controllers for new apps&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.binaryintellect.net/articles/f23506c0-2f40-4dd9-9959-524ca71271d8.aspx&quot;&gt;Mastering Kestrel: From Configuration to Cloud&lt;/a&gt;&lt;br /&gt;
Bipin Joshi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/securing-apps-telerik-ui-aspnet-core-otp-control&quot;&gt;Securing Apps with the Telerik UI for ASP.NET Core OTP Control&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorise.com/blog/optimizing-rendering-and-reconciliation-in-large-blazor-apps&quot;&gt;Optimizing Rendering and Reconciliation in Large Blazor Apps&lt;/a&gt;&lt;br /&gt;
Mladen Macanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/performance-tuning-in-aspnetcore-2025&quot;&gt;Performance Tuning in ASP.NET Core: Best Practices for 2025&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/htmx-aspnetcore-partials&quot;&gt;HTMX with ASP.NET Core Partials: The Server-Side Renaissance&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/odata/announcing-asp-net-core-odata-10-0-0-preview-1/&quot;&gt;Announcing ASP.NET Core OData 10.0.0 Preview 1&lt;/a&gt;&lt;br /&gt;
Samuel Wanjohi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/ii-configuraci%C3%B3n-y-primeros-pasos-juan-irigoyen-4gblf/&quot;&gt;Azure MCP Server II - Configuración y primeros pasos&lt;/a&gt;&lt;br /&gt;
Juan Irigoyen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/minimal-apis-cqrs-ddd-or-just-use-controllers/&quot;&gt;Minimal APIs, CQRS, DDD… Or Just Use Controllers?&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.postman.com/websockets-vs-http-key-differences-explained/&quot;&gt;WebSockets vs HTTP: Key Differences Explained&lt;/a&gt;&lt;br /&gt;
The Postman Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/the-false-comfort-of-the-happy-path-decoupling-your-services&quot;&gt;The False Comfort of the &quot;Happy Path&quot;: Decoupling Your Services&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/odata/announcing-odata-net-odl-9-preview-3-release/&quot;&gt;Announcing OData .NET (ODL) 9 Preview 3 Release&lt;/a&gt;&lt;br /&gt;
John Gathogo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/d6150b89-a3ef-407e-add2-7afa4a2a8729&quot;&gt;Using sortable UUID / GUIDs in Entity Framework&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/efmigrationstherightway&quot;&gt;You&#39;re Probably Doing EF Migrations wrong...&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/azure-sql/vscode-mssql-edit-data/&quot;&gt;MSSQL Extension for VS Code: Introducing Edit Data (Public Preview)&lt;/a&gt;&lt;br /&gt;
Yo-Lei Chen&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-5&quot;&gt;Introducing Claude Opus 4.5 \ Anthropic&lt;/a&gt;&lt;br /&gt;
Anthopic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mostlylucid.net/blog/rag-practical-applications&quot;&gt;RAG in Practice: Building Real-World Applications&lt;/a&gt;&lt;br /&gt;
Scott Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2025/11/building-our-first-mcp-resources.html&quot;&gt;Building our first MCP Resources enabled MCP Server with C#&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/angular-21-rendimiento-ia-y-productividad-para-el-desarrollo-web-empresarial.aspx&quot;&gt;Angular 21: desarrollo web empresarial más rápido, inteligente y accesible&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsiervos.com/archivo/internet/todo-navegador-web-revela-sin-que-se-sepa.html&quot;&gt;Todo lo que el navegador web revela sin que se sepa&lt;/a&gt;&lt;br /&gt;
Álvaro Ibáñez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/create-fillable-pdf-forms-javascript&quot;&gt;How to Create Interactive Fillable PDF Forms Using JavaScript PDF Viewer&lt;/a&gt;&lt;br /&gt;
Arun Kumar Chandrakesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/on-inheriting-and-sharing-property-values/&quot;&gt;On Inheriting and Sharing Property Values&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://christianheilmann.com/2025/11/24/shuffling-a-css-grid-using-custom-properties/&quot;&gt;Shuffling a CSS grid using custom properties&lt;/a&gt;&lt;br /&gt;
Christian Heilmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2025/WD-css-backgrounds-4-20251125/&quot;&gt;CSS Backgrounds Module Level 4 - Working Draft&lt;/a&gt;&lt;br /&gt;
Elika J. Etemad &amp;amp; Lea Verou &amp;amp; Sebastian Zartner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/simplify-react-components-with-derived-state/&quot;&gt;How to Simplify Your React Components with Derived State&lt;/a&gt;&lt;br /&gt;
Olaleye Blessing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/angular-21-my-favorite-new-features-quick-demo-look-whats-next&quot;&gt;Angular 21: My Favorite New Features, Demo, What’s Next&lt;/a&gt;&lt;br /&gt;
Alyssa Nicoll&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/youre-doing-javascript-testing-wrong/&quot;&gt;You&#39;re doing JavaScript testing wrong&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/securing-apps-telerik-ui-aspnet-core-otp-control&quot;&gt;Securing Apps with the Telerik UI for ASP.NET Core OTP Control&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lackofimagination.org/2025/11/managing-side-effects-a-javascript-effect-system-in-30-lines-or-less/&quot;&gt;Managing Side Effects: A JavaScript Effect System in 30 Lines or Less&lt;/a&gt;&lt;br /&gt;
Aycan Gulez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/angular-21-updates-syncfusion-support&quot;&gt;Angular 21 Is Here: How Syncfusion Delivers Compatibility Support&lt;/a&gt;&lt;br /&gt;
Sabari Anand S.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zachleat.com/web/hallucinate/&quot;&gt;How to Hallucinate using Web Components—zachleat.com&lt;/a&gt;&lt;br /&gt;
Zach Leatherman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/how-closures-work-in-javascript-a-handbook-for-developers/&quot;&gt;How Closures Work in JavaScript: A Handbook for Developers&lt;/a&gt;&lt;br /&gt;
Sumit Saha&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/web-platform-11-2025&quot;&gt;New to the web platform in November&lt;/a&gt;&lt;br /&gt;
Rachel Andrew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/webgpu-supported-major-browsers&quot;&gt;WebGPU is now supported in major browsers&lt;/a&gt;&lt;br /&gt;
François Beaufort&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-built-for-the-speed-of-modern-development/&quot;&gt;Visual Studio – Built for the Speed of Modern Development&lt;/a&gt;&lt;br /&gt;
Paul Chapman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/manage-containers-the-easy-way-copilot-vs-code&quot;&gt;Manage Containers the Easy Way: Copilot + VS Code&lt;/a&gt;&lt;br /&gt;
Matt Hernandez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hanselman.com/blog/automatically-signing-a-windows-exe-with-azure-trusted-signing-dotnet-sign-and-github-actions&quot;&gt;Automatically Signing a Windows EXE with Azure Trusted Signing, dotnet sign, and GitHub Actions&lt;/a&gt;&lt;br /&gt;
Scott Hanselman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.advancedinstaller.com/create-msi-installer-with-visual-studio-2026.html&quot;&gt;How to Create an MSI Installer with Visual Studio 2026&lt;/a&gt;&lt;br /&gt;
Renato Ivanescu&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/dotnet-maui-weather-forecast-calendar&quot;&gt;Visualize Monthly Weather Forecasts with .NET MAUI Scheduler&lt;/a&gt;&lt;br /&gt;
Jeyasri Murugan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/replicating-christmas-ui-net-maui&quot;&gt;Replicating a Christmas UI in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Leomaris Reyes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hyperact.co.uk/blog/scaling-a-culture&quot;&gt;Scaling culture in a scale-up&lt;/a&gt;&lt;br /&gt;
Rob Nicholson&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/2587375959938999299/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/2587375959938999299' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2587375959938999299'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2587375959938999299'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/12/enlaces-interesantes-630.html' title='Enlaces interesantes 630'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeeEv-cA2ebptUo3AwG6Tw_B7aoZ_STVibFg13pMYjxDq6e_QRjZ-qr4uQoVnfc9MbQ8_ASbhp3yKQ61XG2UW4n4OXA7ane3i2uOOYhVfBkqsI2SolTOBNHOS8yMJRE0nZ5h5J1edSISs1-yNf8Lw74yzDBkeJ6yAEKPR7Tfrq3GkyQ1W5hMZwvA/s72-c/happy-path.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-3076251838830156365</id><published>2025-11-24T08:05:00.058+01:00</published><updated>2025-11-24T08:05:00.113+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 629</title><content type='html'>&lt;img alt=&quot;Programador usando un ordenador Minivac en los años 60&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFBcCLYUSB8oTDgLX2srDMBKWL7XAACKQC870RR8xPoXtygRmbfPMV6rGFYrmU3VP5NMAEAuew6Ct1hbDLsdYrHARI_LfdvDFYU-QiNbgNh8LbC0xZ0wBKrC3BAzfBg4QW111BMIvzXeLxhp4S_TKaM_1JNKHEc66RY0V6aNck0YETWJpniqDR4w/s800/minivac.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Años atrás, en los inicios de la informática, se programaba de forma bastante diferente: conectando cables y usando paneles de interruptores. Por eso me ha parecido muy curioso el &lt;a href=&quot;https://minivac.greg.technology/&quot; target=&quot;_blank&quot;&gt;simulador del Minivac 601&lt;/a&gt;, un ordenador de los años 60,&amp;nbsp; donde podemos probar de primera mano cómo era su experiencia de uso.&lt;/p&gt;
&lt;p&gt;Y continuando con temas &lt;em&gt;vintage&lt;/em&gt;, Microsoft ha &lt;a href=&quot;https://opensource.microsoft.com/blog/2025/11/20/preserving-code-that-shaped-generations-zork-i-ii-and-iii-go-open-source&quot; target=&quot;_blank&quot;&gt;anunciado la liberación del código fuente de los juegos Zork I, II y III&lt;/a&gt;,&amp;nbsp;la mítica saga de aventuras conversacionales de los años 80. Pura historia del software.&lt;/p&gt;&lt;p&gt;También esta semana encontramos una interesante lectura de Sudhir Mangla donde explica c&lt;a href=&quot;https://developersvoice.com/blog/oops/modern_csharp_beyond_solid_patterns/&quot; target=&quot;_blank&quot;&gt;ómo usar patrones modernos y características recientes de C# para construir modelos más expresivos, seguros y mantenibles&lt;/a&gt; que los que ofrece la aplicación estricta de SOLID.&lt;/p&gt;

&lt;p&gt;El resto de enlaces interesantes recopilados esta semana, entre los que podéis encontrar información sobre .NET 10, ASP.NET Core, IA, desarrollo web y mucho más, los tenéis a continuación.&lt;/p&gt;
&lt;h4&gt;Por si te lo perdiste...&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2024/10/creando-guids-con-orden-natural-en-net-9.html&quot;&gt;Creando GUIDs con orden natural en .NET 9&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2018/11/localizar-errores-de-validacion-del.html&quot;&gt;Localizar errores de validación del binding en ASP.NET Core MVC&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/introducing-csharp-14/&quot;&gt;Introducing C# 14&lt;/a&gt;&lt;br /&gt;
Uwe Keim&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/introducing-fsharp-10/&quot;&gt;Introducing F# 10&lt;/a&gt;&lt;br /&gt;
Adam Boniecki&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/exploring-csharp-file-based-apps-in-dotnet-10&quot;&gt;Exploring C# File-based Apps in .NET 10&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://solrevdev.com/2025/11/14/upgrading-seedfolder-to-dotnet-10-lts.html&quot;&gt;How to Upgrade to .NET 10 LTS - Complete Guide for .NET Global Tools with Multi-Targeting&lt;/a&gt;&lt;br /&gt;
John Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/post-quantum-cryptography-in-dotnet/&quot;&gt;Post-Quantum Cryptography in .NET&lt;/a&gt;&lt;br /&gt;
Jeremy Barton&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/reinventing-how-dotnet-builds-and-ships-again/&quot;&gt;Reinventing how .NET Builds and Ships (Again)&lt;/a&gt;&lt;br /&gt;
Gábor Szabó&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/companies-using-dotnet-need-to-suck-it-up-and-pay-for-support/&quot;&gt;Companies complaining .NET moves too fast should just pay for post-EOL support&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-10-testing/&quot;&gt;.NET 10 Testing: Microsoft Finally Fixed the Test Runner (Mostly)&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/optimize-guid-creation-performance-in-dotnet-applications.htm&quot;&gt;Optimize GUID creation performance in .NET applications&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ardalis.com/how-to-update-net-on-wsl-or-ubuntu/&quot;&gt;How to Update .NET on Wsl or Ubuntu&lt;/a&gt;&lt;br /&gt;
Steve Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/9c156006-3e54-45b9-8e0c-ea933e005983&quot;&gt;No more public partial class Program in .NET 10&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cazzulino.com/running-remote-csharp-scripts.html&quot;&gt;Streamlining Remote C# Scripts with .NET 10 runfile&lt;/a&gt;&lt;br /&gt;
Daniel Cazzulino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/practical-approach-di-variation-net-introducing-child-fernando-mbgrf/&quot;&gt;A Practical Approach to DI Variation in .NET: Introducing Child Service Providers&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.soundaranbu.com/state-of-nativeaot-net10&quot;&gt;State of Native AOT in .NET 10&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;ASP.NET Core / ASP.NET / Blazor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2025/11/multitenancy-techniques-for-aspnet-core.html&quot;&gt;Multitenancy Techniques for ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://damienbod.com/2025/11/17/implement-forgot-your-password-using-swiyu-asp-net-core-identity-and-aspire/&quot;&gt;Implement forgot your password using swiyu, ASP.NET Core Identity and&amp;nbsp;Aspire&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/blazor-file-upload-with-video-preview&quot;&gt;How to Add Video Preview to the Blazor File Upload Component&lt;/a&gt;&lt;br /&gt;
UdhayaKumar Duraisamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/openapi/openapi-net-release-announcements/&quot;&gt;OpenAPI.NET: The Biggest Update Ever&lt;/a&gt;&lt;br /&gt;
Darrel Miller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/whats-new-aspdotnet-core-10-in-net-10&quot;&gt;What’s New in ASP.NET Core 10 for .NET 10: Key Features and Enhancements&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/blazor-basics-building-drag-drop-functionality-blazor-applications&quot;&gt;Blazor Basics: Building Drag-and-Drop Functionality&lt;/a&gt;&lt;br /&gt;
Claudio Bernasconi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2025/11/19/how-blazors-unified-rendering-model-shapes-modern-net-web-apps.aspx&quot;&gt;How Blazor&#39;s Unified Rendering Model Shapes Modern .NET Web Apps&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.textcontrol.com/blog/2025/11/20/securing-websocket-connections-in-aspnet-core-using-sec-websocket-protocol-header/&quot;&gt;Securing WebSocket Connections in ASP.NET Core using Sec WebSocket Protocol Header&lt;/a&gt;&lt;br /&gt;
Bjoern Meyer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Azure / Cloud&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.microsoft.com/blog/2025/11/12/infinite-scale-the-architecture-behind-the-azure-ai-superfactory/&quot;&gt;Infinite scale: The architecture behind the Azure AI superfactory&lt;/a&gt;&lt;br /&gt;
Scott Guthrie&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Conceptos / Patrones / Buenas prácticas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bravedeveloper.com/2025/11/16/la-capa-de-dominio-en-clean-architecture-que-debe-contener-y-por-que/&quot;&gt;La Capa de Dominio en Clean Architecture: Qué debe contener y por qué&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://franiglesias.github.io/primitive-obsession/&quot;&gt;Primitive Obsession&lt;/a&gt;&lt;br /&gt;
Fran Iglesias&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ploeh.dk/2025/11/17/empirical-software-prototyping/&quot;&gt;Empirical software prototyping&lt;/a&gt;&lt;br /&gt;
Mark Seemann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stackademic.com/a-developers-guide-to-oauth-2-0-workflows-web-mobile-spa-machine-to-machine-and-device-flows-2651b6479e17&quot;&gt;A Developer’s Guide to OAuth 2.0 Workflows: Web, Mobile, SPA, Machine-to-Machine, and Device Flows&lt;/a&gt;&lt;br /&gt;
Subodh Shetty&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/oops/modern_csharp_beyond_solid_patterns/&quot;&gt;Beyond SOLID in Modern C#: Smart Enums, Discriminated Unions &amp;amp; Railway-Oriented Programming&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/sql-server-2025-is-now-generally-available/4470570&quot;&gt;SQL Server 2025 is Now Generally Available&lt;/a&gt;&lt;br /&gt;
Venkata Raj Pochiraju&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/how-i-have-increased-the-production-payment-system-performance-by-15x-with-efcore-extensions&quot;&gt;How I Have Increased the Production Payment System Performance by 15x With One Line of Code in EF Core&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/building-read-models-with-ef-core-projections/&quot;&gt;Building Read Models with EF Core Projections&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Machine learning / IA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/gpt-5-1-codex-max-nuevo-modelo-hiperespecializado-en-programacion.aspx&quot;&gt;GPT-5.1-Codex-Max: nuevo modelo hiperespecializado en programación&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/products/gemini/gemini-3/&quot;&gt;Gemini 3: Introducing the latest Gemini AI model from Google&lt;/a&gt;&lt;br /&gt;
Sundar Pichai &amp;amp; Demis Hassabis &amp;amp; Koray Kavukcuoglu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/products/search/gemini-3-search-ai-mode/&quot;&gt;Google brings Gemini 3 AI model to Search and AI Mode&lt;/a&gt;&lt;br /&gt;
Elizabeth Hamon Reid&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web / HTML / CSS / Javascript&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.enmilocalfunciona.io/angular-signal-forms-un-cambio-de-paradigma/&quot;&gt;Angular Signal Forms: un cambio de paradigma&lt;/a&gt;&lt;br /&gt;
Saúl Moro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.angular.dev/announcing-angular-v21-57946c34f14b&quot;&gt;Announcing Angular v21&lt;/a&gt;&lt;br /&gt;
Jens Kuehlers &amp;amp; Mark “Techson” Thompson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/memory-leaks-in-javascript-pdf-viewer&quot;&gt;How to Fix Memory Leaks in JavaScript PDF Viewers: Best Practices and Debugging Tips&lt;/a&gt;&lt;br /&gt;
RajaVignesh BalaSankar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-most-hated-css-feature-asin-acos-atan-and-atan2/&quot;&gt;The “Most Hated” CSS Feature: asin(), acos(), atan() and atan2()&lt;/a&gt;&lt;br /&gt;
Juan Diego Rodríguez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/should-we-even-have-closed/&quot;&gt;Should We Even Have&amp;nbsp;:closed?&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2025/11/keyframes-tokens-standardizing-animation-across-projects/&quot;&gt;Keyframes Tokens: Standardizing Animation Across Projects&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;Six Things I Bet You Didn&#39;t Know You Could Do With Chrome&#39;s Devtools, &lt;a href=&quot;https://www.readwriterachel.com/things-i-learned/2025/11/09/devtools-1.html&quot;&gt;Part 1&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.readwriterachel.com/things-i-learned/2025/11/17/devtools-2.html&quot;&gt;Part 2&lt;/a&gt;&lt;br /&gt;
Rachel Kaufman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/typescript-without-typescript/&quot;&gt;Typescript without Typescript&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/angular-signal-forms-vs-reactive-forms&quot;&gt;Angular Signal Forms vs. Reactive Forms&lt;/a&gt;&lt;br /&gt;
Jonathan Gamble&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/react-19-2-the-async-shift/&quot;&gt;React 19.2: The async shift is finally here&lt;/a&gt;&lt;br /&gt;
Jack Herrington&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/practical-introduction-async-generators-javascript&quot;&gt;Practical Introduction to Async Generators in JavaScript&lt;/a&gt;&lt;br /&gt;
Peter Mbanugo&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Visual Studio / Complementos / Herramientas&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/spend-less-time-upgrading-more-time-coding-in-visual-studio-2026/&quot;&gt;Spend Less Time Upgrading, More Time Coding in Visual Studio 2026&lt;/a&gt;&lt;br /&gt;
Narayan Subramanian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/modernizing-dotnet-with-github-copilot-agent-mode/&quot;&gt;A step-by-step guide to modernizing .NET applications with GitHub Copilot agent mode&lt;/a&gt;&lt;br /&gt;
Jason Baginski&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/github-copilot-testing-for-dotnet/&quot;&gt;Supercharge Your Test Coverage with GitHub Copilot Testing for .NET&lt;/a&gt;&lt;br /&gt;
McKenna Barlow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://haacked.com/archive/2025/11/21/tree-me/&quot;&gt;tree-me: Because git worktrees shouldn’t be a chore&lt;/a&gt;&lt;br /&gt;
Phil Haack&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/blogs/2025/11/18/PrivateMarketplace&quot;&gt;Introducing the Visual Studio Code Private Marketplace: Your Team&#39;s Secure, Curated Extension Hub&lt;/a&gt;&lt;br /&gt;
Sean Iyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2025/11/hands-on-with-mcp-resources-in-visual.html&quot;&gt;Hands-on with MCP Resources in Visual Studio&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20251120-inspect-and-validate-json-web-tokens-with-the-duende-jwt-decoder&quot;&gt;Inspect and Validate JSON Web Tokens with the Duende JWT Decoder&lt;/a&gt;&lt;br /&gt;
Wesley Cabus&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;.NET MAUI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2025/11/net-maui-10-quality-performance/&quot;&gt;.NET 10 Improves MAUI Quality and Performance&lt;/a&gt;&lt;br /&gt;
Edin Kapić&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/que-es-cloudflare-y-por-que-su-caida-paraliza-internet.aspx&quot;&gt;¿Qué es Cloudflare y por qué su caída paraliza internet?&lt;/a&gt;&lt;br /&gt;
CampusMVP&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://minivac.greg.technology/&quot;&gt;Minivac 601 Simulator&lt;/a&gt;&lt;br /&gt;
Greg Sadetsky&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opensource.microsoft.com/blog/2025/11/20/preserving-code-that-shaped-generations-zork-i-ii-and-iii-go-open-source&quot;&gt;Preserving code that shaped generations: Zork I, II, and III go Open Source&lt;/a&gt;&lt;br /&gt;
Stacey haffner &amp;amp; Scott hanselman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/3076251838830156365/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/3076251838830156365' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3076251838830156365'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/3076251838830156365'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/11/enlaces-interesantes-629.html' title='Enlaces interesantes 629'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFBcCLYUSB8oTDgLX2srDMBKWL7XAACKQC870RR8xPoXtygRmbfPMV6rGFYrmU3VP5NMAEAuew6Ct1hbDLsdYrHARI_LfdvDFYU-QiNbgNh8LbC0xZ0wBKrC3BAzfBg4QW111BMIvzXeLxhp4S_TKaM_1JNKHEc66RY0V6aNck0YETWJpniqDR4w/s72-c/minivac.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-8180050407243095463</id><published>2025-11-18T07:54:00.055+01:00</published><updated>2025-11-20T12:52:11.033+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="c#14"/><category scheme="http://www.blogger.com/atom/ns#" term="novedades"/><title type='text'>Novedades de C# 14</title><content type='html'>&lt;img alt=&quot;C# 14 ya está aquí&quot; class=&quot;main-post-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjnao2jajSSniZlwRJCVlWsYIu_3D-OTQQXp12HIE1loBS7bzVw0X0dACU_76adpihkxB4uvAUiuHTCOlBA-BcZNt157HsJG_NOchY4KBhkjqOo4X31vdBT6gOD6WchGZ0cXk1y5LJtHvQJx3-rjHutc9jzRjm2LsFSXbCkFcar7bVZ29jv4O2sA/s800/csharp14.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Hace unos días se lanzó .NET 10 y, con él, C# 14, una nueva versión del lenguaje que viene con varias novedades interesantes que mejoran la productividad y la experiencia de desarrollo.&lt;/p&gt;
&lt;p&gt;Las más destacables son:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#extensores&quot;&gt;Miembros extensores&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#asignaciones&quot;&gt;Asignaciones condicionales&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#propiedades&quot;&gt;Propiedades semi-automáticas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nameof&quot;&gt;Simplificación del uso de &lt;code&gt;nameof&lt;/code&gt; con tipos genéricos&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#parciales&quot;&gt;Eventos y constructores parciales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#conversiones&quot;&gt;Conversiones implícitas para &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt; y &lt;code&gt;ReadOnlySpan&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#lambdas&quot;&gt;Simplificación de parámetros de lambdas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les damos un vistazo rápido a continuación.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;extensores&quot;&gt;Miembros extensores&lt;/h2&gt;
&lt;p&gt;Hasta C# 13, los métodos extensores (&lt;em&gt;extension methods&lt;/em&gt;) eran la única forma de añadir funcionalidad o características a tipos existentes sin necesidad de modificar su código fuente original. Sin embargo, esta técnica tenía limitaciones, como la imposibilidad de añadir propiedades o eventos, o definirlas sobre clases estáticas. Además, la forma en la que los implementábamos no favorecía especialmente la legibilidad del código.&lt;/p&gt;
&lt;p&gt;En C# 14, los métodos extensores siguen siendo válidos y retrocompatibles a nivel de código, pero el concepto ha sido ampliado significativamente. A partir de esta versión, se han introducido &lt;strong&gt;los bloques &lt;code&gt;extension&lt;/code&gt; como delimitadores para definir miembros extensores de un mismo tipo&lt;/strong&gt; de una forma más estructurada y legible. Observa el siguiente código, donde podemos ver la comparativa entre la sintaxis clásica y la nueva:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// C# 13 y anteriores
public static class StringExtensions
{
    public static bool IsCapitalized(this string str) 
    {
        return !string.IsNullOrEmpty(str) &amp;amp;&amp;amp; char.IsUpper(str[0]);
    }
    public static bool IsInteger(this string str) 
    {
        return int.TryParse(str, out _);
    }
}

// C# 14:
public static class StringExtensions
{
    extension(string str)
    {
        public bool IsCapitalized()
        {
            return !string.IsNullOrEmpty(str) &amp;amp;&amp;amp; char.IsUpper(str[0]);
        }
        public bool IsInteger()
        {
            return int.TryParse(str, out _);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pero la cosa no queda ahí 🙂. Además del bloque &lt;code&gt;extension&lt;/code&gt;, C# 14 introduce la posibilidad de definir otros tipos de miembros extensores, tanto de instancia como estáticos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public static class StringExtensions
{
    extension(string str)
    {
        // Propiedad extensora:
        public char? FirstCharacter
        {
            get =&amp;gt; string.IsNullOrEmpty(str) ? null : str[0];
        }
    }

    extension(Math)
    {
        // Extensión de clase estática:
        public static int Factorial(int n)
        {
            if (n &amp;lt; 0) throw new ArgumentException(&quot;Invalid negative value&quot;, nameof(n));
            return n == 0 ? 1 : n * Factorial(n - 1);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Podéis leer más sobre miembros extensores en &lt;a href=&quot;https://www.variablenotfound.com/2025/10/extension-members-en-c-14-net-10.html&quot;&gt;este post de hace unas semanas&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;asignaciones&quot;&gt;Asignaciones condicionales&lt;/h2&gt;
&lt;p&gt;Llevamos tiempo usando operadores como &lt;em&gt;null coalescing&lt;/em&gt; (&lt;code&gt;??&lt;/code&gt;), &lt;em&gt;null coalescing assignment&lt;/em&gt; (&lt;code&gt;??=&lt;/code&gt;) o &lt;em&gt;safe navigation&lt;/em&gt; (&lt;code&gt;?.&lt;/code&gt;)  para lidiar con valores nulos de una forma más concisa y legible. En C# 14 se ha extendido este último para permitir su aplicación en el lado izquierdo de una asignación, permitiéndonos &lt;strong&gt;asignar valores a propiedades o campos de objetos que podrían ser nulos&lt;/strong&gt;, sin necesidad de realizar comprobaciones explícitas.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// C# 13 y anteriores:
var friend = GetFriendOrNull(1);
if (friend != null)
{
    friend.Name = &quot;John Doe&quot;;
}

// C# 14:
var friend = GetFriendOrNull(1);
friend?.Name = &quot;John Doe&quot;; // Si friend es nulo, no se lanza excepción y no se asigna valor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si queréis profundizar algo más, hace algún tiempo hablamos de esta característica en &lt;a href=&quot;https://www.variablenotfound.com/2025/05/asignaciones-seguras-con-null.html&quot;&gt;este otro post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;propiedades&quot;&gt;Propiedades semi-automáticas&lt;/h2&gt;
&lt;p&gt;Las propiedades semiautomáticas son una mezcla entre las propiedades automáticas y las tradicionales con &lt;em&gt;backing field&lt;/em&gt;, pero tomando lo mejor de ambos mundos. Gracias a esta característica podemos definir propiedades con un campo de respaldo generado automáticamente, pero al mismo tiempo nos dan la flexibilidad de &lt;b&gt;acceder a él mediante la palabra clave contextual &lt;code&gt;field&lt;/code&gt;&lt;/b&gt;, lo que nos permite personalizar los accesores &lt;code&gt;get&lt;/code&gt; y &lt;code&gt;set&lt;/code&gt; según nuestras necesidades.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// C# 13 y anteriores:
private int _age;
public int Age
{
    get { return _age; }
    set {
        if (value &amp;lt; 0) throw new ArgumentException(&quot;Age cannot be negative&quot;);
        _age = value;
    }
}

// C# 14:
public int Age
{
    get; // Retorna el valor del backing field generado automáticamente
    set
    {
        if (value &amp;lt; 0) throw new ArgumentException(&quot;Age cannot be negative&quot;);
        field = value; // &#39;field&#39; es el backing field
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para ver esta característica en mayor detalle, podéis consultar el post &lt;a href=&quot;https://www.variablenotfound.com/2024/12/propiedades-semi-automaticas-en-c.html&quot;&gt;Propiedades semi-automáticas en C#&lt;/a&gt; que publiqué por aquí hace ya casi un año.&lt;/p&gt;
&lt;h2 id=&quot;nameof&quot;&gt;Uso de &lt;code&gt;nameof&lt;/code&gt; con tipos genéricos&lt;/h2&gt;
&lt;p&gt;El operador &lt;code&gt;nameof&lt;/code&gt; ha sido mejorado para &lt;b&gt;permitir el uso de tipos genéricos sin especificar sus parámetros de tipo&lt;/b&gt;, algo que antes no era posible.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;Console.WriteLine(nameof(List&amp;lt;&amp;gt;)); // Imprime &quot;List&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;parciales&quot;&gt;Constructores y eventos parciales&lt;/h2&gt;
&lt;p&gt;También es interesante comentar que ahora se permite la implementación de &lt;b&gt;constructores y eventos parciales&lt;/b&gt;. En la práctica, esto quiere decir que podemos definir este tipo de miembros en una parte de una clase parcial, y completarlos en otra.&lt;/p&gt;
&lt;p&gt;Como podemos ver en el siguiente ejemplo, en la primera porción de la clase definimos los elementos como &lt;code&gt;partial&lt;/code&gt; y en la segunda los implementamos. Fijaos que en el caso del evento, debemos definir los bloques &lt;code&gt;add&lt;/code&gt; y &lt;code&gt;remove&lt;/code&gt; para gestionar los suscriptores:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Definición en una parte de la clase parcial:
public partial class MyClass
{
    public partial MyClass(string something); // Partial constructor declaration
    public partial event EventHandler? OnMyEvent; // Partial event declaration
}

// Implementación en otra parte de la clase parcial:
public partial class MyClass
{
    public partial MyClass(string something)
    {
        // Constructor implementation
    };

    private EventHandler? _onMyEvent;

    public partial event EventHandler? OnMyEvent
    {
        add
        {
            _onMyEvent += value; // Subscriber added
        }

        remove
        {
            _onMyEvent -= value; // Subscriber removed
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conversiones&quot;&gt;Conversiones implícitas para &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt; y &lt;code&gt;ReadOnlySpan&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;C# 14 introduce &lt;b&gt;conversiones implícitas para los tipos &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt; y &lt;code&gt;ReadOnlySpan&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/b&gt;, facilitando su uso y manipulación sin necesidad de conversiones explícitas.&lt;/p&gt;
&lt;p&gt;Por ejemplo, el bloque de código mostrado a continuación no compila en versiones anteriores a C# 14, porque el método &lt;code&gt;StartsWith()&lt;/code&gt; es un extensor del tipo &lt;code&gt;ReadOnlySpan&amp;lt;int&amp;gt;&lt;/code&gt; y no existe en la clase &lt;code&gt;Array&lt;/code&gt;. Sin embargo, en C# 14, gracias a las conversiones implícitas, este código funciona correctamente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;int[] arr = [1, 2, 3];
Console.WriteLine(arr.StartsWith(1)); // Muestra &quot;True&quot; en C# 14
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lambdas&quot;&gt;Modificadores simplificados en parámetros lambda&lt;/h2&gt;
&lt;p&gt;En C# 14, se pueden usar modificadores de parámetros como &lt;code&gt;scoped&lt;/code&gt;, &lt;code&gt;ref&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;, &lt;code&gt;out&lt;/code&gt;, o &lt;code&gt;ref readonly&lt;/code&gt; en expresiones lambda &lt;b&gt;sin necesidad de especificar el tipo del parámetro&lt;/b&gt;, haciendo el código algo más conciso y legible.&lt;/p&gt;
&lt;p&gt;Por ejemplo, observa la sutil diferencia entre C# 13 y 14 en la siguiente definición de un delegado que intenta parsear un valor:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;// Definición del delegado
delegate bool TryParse&amp;lt;T&amp;gt;(string text, out T result);

// C# 13 y anteriores
TryParse&amp;lt;int&amp;gt; parser = (string text, out int result) =&amp;gt; int.TryParse(text, out result);

// C# 14
TryParse&amp;lt;int&amp;gt; parser = (string text, out result) =&amp;gt; int.TryParse(text, out result);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La segunda opción no compilará en versiones anteriores de C# porque en el parámetro &lt;code&gt;out&lt;/code&gt; de la expresión lambda no se especifica el tipo &lt;code&gt;int&lt;/code&gt;. En C# 14 es perfectamente válido, porque puede ser inferido del delegado.&lt;/p&gt;
&lt;h2 id=&quot;extra&quot;&gt;Punto extra: ¿podemos usar C# 14 en proyectos .NET 9 o Visual Studio 2022?&lt;/h2&gt;
&lt;p&gt;Pues sí, es posible porque &lt;b&gt;estamos hablando de características del lenguaje&lt;/b&gt; y no del &lt;em&gt;framework&lt;/em&gt;, así que podremos aprovechar estas novedades en proyectos dirigidos a versiones anteriores de .NET y con Visual Studio 2022.&lt;/p&gt;
&lt;p&gt;Para ello, simplemente debemos asegurarnos de configurar la versión del lenguaje en la propiedad &lt;code&gt;LangVersion&lt;/code&gt; del archivo de proyecto (&lt;code&gt;.csproj&lt;/code&gt;), especificando &lt;code&gt;14.0&lt;/code&gt;, como se muestra a continuación:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;PropertyGroup&amp;gt;
    &amp;lt;LangVersion&amp;gt;14.0&amp;lt;/LangVersion&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Publicado en &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;Variable not found&lt;/a&gt;.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/8180050407243095463/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/8180050407243095463' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8180050407243095463'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8180050407243095463'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2025/11/novedades-de-c-14.html' title='Novedades de C# 14'/><author><name>José María Aguilar</name><uri>http://www.blogger.com/profile/08255861077355617652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjnao2jajSSniZlwRJCVlWsYIu_3D-OTQQXp12HIE1loBS7bzVw0X0dACU_76adpihkxB4uvAUiuHTCOlBA-BcZNt157HsJG_NOchY4KBhkjqOo4X31vdBT6gOD6WchGZ0cXk1y5LJtHvQJx3-rjHutc9jzRjm2LsFSXbCkFcar7bVZ29jv4O2sA/s72-c/csharp14.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>