<?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-06-15T08:01:00.113+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="visualstudio"/><category term="webapi"/><category term="depuración"/><category term="efcore"/><category term="frases célebres"/><category term="productividad"/><category term="trabajo"/><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="optimización"/><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="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#15"/><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>1644</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27752126.post-8840370283828284650</id><published>2026-06-15T08:01:00.000+02:00</published><updated>2026-06-15T08:01:00.110+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 652</title><content type='html'>&lt;img alt=&quot;Dos celdas en el Area 51: una para Claude Fable y otra para Claude Mythos&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFF82EshCMsMsdxXd7ODg1lCb38Po6a1tD0FHJOJT0eQ3Xw3Vh_oGZ-6CHAJjfK5igFvv16OSnxT5ja0D_W52Dk6gF9X1UAguEwkdmwdFwwY8LpsqbP5rRTg05k4E6hreCrEZMGXKneMBcSooAvOSqg10s2jjZ2eDcHKMq5z829bSvulKKvBFjsw/s800/national-security.jpg&quot; width=&quot;100%&quot; /&gt;


&lt;p&gt;Esta semana hay que destacar tanto &lt;a href=&quot;https://www.anthropic.com/news/claude-fable-5-mythos-5&quot; target=&quot;_blank&quot;&gt;el anuncio a bombo y platillo de los modelos Claude Fable y Mythos 5 de Anthropic&lt;/a&gt;... como &lt;a href=&quot;https://www.anthropic.com/news/fable-mythos-access&quot; target=&quot;_blank&quot;&gt;su retirada unos días después&lt;/a&gt;, debido una orden del gobierno de Estados Unidos por motivos de seguridad nacional. Un mundo curioso este 😉&amp;nbsp;&lt;/p&gt;
&lt;p&gt;También se ha lanzado .NET 11 Preview 5, con novedades interesantes como el soporte para JSONL, full outer joins en LINQ, mejoras en runtime asíncrono, una nueva plantilla de proyecto MCP, jerarquías cerradas en C#, validación en cliente y QuickGrid en Blazor SSR, parámetros proporcionados por variables de sesión y muchas más cosas, que &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-5/&quot; target=&quot;_blank&quot;&gt;podéis encontrar detalladas aquí&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por último, destacar un artículo sobre &lt;a href=&quot;https://www.milanjovanovic.tech/blog/dry-is-the-most-misunderstood-rule-in-programming&quot; target=&quot;_blank&quot;&gt;el principio DRY&lt;/a&gt;, uno de los más utilizados mientras programamos, pero que a menudo se malinterpreta. Milan Jovanović nos explica por qué y cómo debemos aplicarlo correctamente.&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/2025/05/asignaciones-seguras-con-null.html&quot;&gt;Asignaciones seguras con &#39;null conditional assignments&#39; de C# 14 (.NET 10)&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/10/switch-expressions-en-c-8.html&quot;&gt;Switch expressions en C# 8&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.developerro.com/2026/06/10/proxies-go-csharp/&quot;&gt;Proxies en Go o C#&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-5/&quot;&gt;.NET 11 Preview 5 is now available!&lt;/a&gt;&lt;br /&gt;
.NET Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-at-microsoft-build-2026/&quot;&gt;.NET at Microsoft Build 2026: Must watch sessions&lt;/a&gt;&lt;br /&gt;
Daniel Roth&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/build-recap&quot;&gt;Microsoft Build 2026 recap: vision, launches, and top sessions&lt;/a&gt;&lt;br /&gt;
Jon Galloway&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/html-to-markdown-csharp-word-library&quot;&gt;Convert HTML to Markdown in C# Without Losing Structure or Images&lt;/a&gt;&lt;br /&gt;
Mathan Kumar Varadharaja&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/06/06/model-validation-in-aspnet-core-data-annotations-and-fluentvalidation&quot;&gt;Model Validation in ASP.NET Core: Data Annotations and FluentValidation&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnettips.com/2026/06/07/boost-your-net-projects-future-proofing-performance-with-spargines-fast-methods/&quot;&gt;Boost Your .NET Projects: Future-Proofing Performance with Spargine’s Fast Methods&lt;/a&gt;&lt;br /&gt;
David McCarter&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/introducing-corvus-text-json-v5-why-v5-exists&quot;&gt;Introducing Corvus.Text.Json V5: Why V5 Exists&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thomasclaudiushuber.com/2026/06/05/the-new-visual-studio-solution-file-format-goodbye-sln-welcome-slnx/&quot;&gt;The new Visual Studio Solution File Format: Goodbye .SLN, Welcome .SLNX!&lt;/a&gt;&lt;br /&gt;
Thomas Claudius Huber&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/karenpayneoregon/c14-the-field-keyword-4i5j&quot;&gt;C#14 The field keyword&lt;/a&gt;&lt;br /&gt;
Karen Payne&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/new-features-and-roslyn-analyzers-for-meziantou-framework-fullpath.htm&quot;&gt;New features and Roslyn analyzers for Meziantou.Framework.FullPath&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;Introducing Corvus.Text.Json V5: &lt;a href=&quot;https://endjin.com/blog/introducing-corvus-text-json-v5-schema-validation&quot;&gt;Schema Validation 10x Faster&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://endjin.com/blog/introducing-corvus-text-json-v5-pooled-memory-parsing&quot;&gt;Pooled-Memory Parsing&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/tunit-mocks-source-generated/&quot;&gt;TUnit.Mocks: No Castle, No Reflection, No Drama&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/Jun/13/Creating-a-Packaged-Single-File-Web-Site-Viewer-Executable&quot;&gt;Creating a Packaged Single File Web Site Viewer Executable&lt;/a&gt;&lt;br /&gt;
Rick Strahl&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/06/08/asp-net-core-background-tasks-with-ncronjob-and-signalr/&quot;&gt;ASP.NET Core background tasks with NCronJob and&amp;nbsp;SignalR&lt;/a&gt;&lt;br /&gt;
Damien Bowden&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260609-setting-up-saml-single-sign-on-with-duende-identityserver&quot;&gt;Setting Up SAML Single Sign-On in ASP.NET with Duende IdentityServer&lt;/a&gt;&lt;br /&gt;
Maarteen Balliauw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorhelpwebsite.com/ViewBlogPost/20087&quot;&gt;The Updated Edition of Blazor Succinctly Is Now Available&lt;/a&gt;&lt;br /&gt;
Michael Washington&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.maartenballiauw.be/posts/2026-06-11-what-is-identityserver-and-when-do-you-need-it/&quot;&gt;What is IdentityServer and When Do You Need it?&lt;/a&gt;&lt;br /&gt;
Maarten Balliauw&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/06/08/AppService-Build2026.html&quot;&gt;App Service Build 2026 Updates&lt;/a&gt;&lt;br /&gt;
Byron Tardif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/AzureToolsBlog/faster-az-login-introducing---skip-subscription-discovery-and-targeted---subscri/4526116&quot;&gt;Faster az login: introducing --skip-subscription-discovery and targeted&lt;/a&gt;&lt;br /&gt;
Alex Wdy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/06/10/azcli-startuplogs.html&quot;&gt;Debug App Startup Faster on Azure App Service for Linux with Startup Logs&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://www.milanjovanovic.tech/blog/dry-is-the-most-misunderstood-rule-in-programming&quot;&gt;DRY Is the Most Misunderstood Rule in Programming&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-after-you-leave/&quot;&gt;The Codebase Doesn&#39;t Know You Quit&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-structure-production-apps-with-vertical-slice-architecture-in-dotnet-in-2026&quot;&gt;How to Structure Production Apps with Vertical Slice Architecture in .NET in 2026&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/practicing-vertical-slice-architecture-aspnet-core&quot;&gt;Practicing Vertical Slice Architecture in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Assis Zang&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/d4401fd0-805a-4703-9d9e-5fe3b57c25ea&quot;&gt;EF Core 11 makes your split queries faster&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lennilobel.wordpress.com/2026/06/05/base64-encoding-and-decoding-in-sql-server-2025-and-azure-sql-database/&quot;&gt;Base64 Encoding and Decoding in SQL Server 2025 and Azure SQL Database&lt;/a&gt;&lt;br /&gt;
Leonard Lobel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/ef-core-at-scale-5-ways-to-retrieve-large-datasets-efficiently/&quot;&gt;EF Core at scale: 5 ways to retrieve large datasets efficiently&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://erikdarling.com/moving-indexes-to-a-new-filegroup-or-microsoft-still-hates-you/&quot;&gt;Moving Indexes To A New Filegroup: Microsoft Still Hates You&lt;/a&gt;&lt;br /&gt;
Erik Darling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/announcing-the-release-of-ssms-22-7-0---and-many-previews/4526908&quot;&gt;Announcing the Release of SSMS 22.7.0 - and many previews!&lt;/a&gt;&lt;br /&gt;
Makena Barickman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/introducing-execution-context-for-github-copilot-in-ssms/4527272&quot;&gt;Introducing execution context for GitHub Copilot in SSMS&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://www.anthropic.com/news/claude-fable-5-mythos-5&quot;&gt;Claude Fable 5 and Claude Mythos 5&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/fable-mythos-access&quot;&gt;Statement on the US government directive to suspend access to Fable 5 and Mythos 5&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oreilly.com/radar/long-running-agents/&quot;&gt;Long-Running Agents&lt;/a&gt;&lt;br /&gt;
Addy Osmani&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/scroll-driven-scroll-triggered-scroll-states-and-view-transitions/&quot;&gt;Scroll-Driven, Scroll-Triggered, Scroll States, and View Transitions&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/scrubbable-staggered-animation-with-css-function/&quot;&gt;Scrubbable Staggered Animation with CSS @function&lt;/a&gt;&lt;br /&gt;
Ashutosh Biswas&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/angular-22-evolution-modern-angular&quot;&gt;Angular 22: The Evolution of Modern Angular&lt;/a&gt;&lt;br /&gt;
Dany Paredes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/articles/how-to-detect-when-an-elements-visibility-changes-with-javascript/&quot;&gt;How to detect when an element&#39;s visibility changes with JavaScript&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/creating-memorable-web-experiences-a-modern-css-toolkit/&quot;&gt;Creating Memorable Web Experiences: A Modern CSS Toolkit&lt;/a&gt;&lt;br /&gt;
Mariana Beldi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://master.dev/blog/demystifying-the-view-transition-pseudo-tree/&quot;&gt;Demystifying the View Transition Pseudo Tree – Master.dev Blog&lt;/a&gt;&lt;br /&gt;
Cyd Stumpel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matklad.github.io/2026/06/04/css-unavoidable-bad-parts.html&quot;&gt;CSS: Unavoidable Bad Parts&lt;/a&gt;&lt;br /&gt;
Alex Kladov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/sqlserver/introducing-execution-context-for-github-copilot-in-ssms/4527272&quot;&gt;Introducing execution context for GitHub Copilot in SSMS&lt;/a&gt;&lt;br /&gt;
Mariana Beldi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tempertemper.net/blog/theres-no-need-to-include-navigation-in-your-navigation-labels&quot;&gt;There’s no need to include ‘navigation’ in your navigation labels&lt;/a&gt;&lt;br /&gt;
Martin Underhill&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/why-isnt-my-3d-view-transition-working/&quot;&gt;Why Isn&#39;t My 3D View Transition Working?&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://master.dev/blog/in-n-out-animations-popovers-part-2-3/&quot;&gt;In-N-Out Animations: Popovers (Part 2/3) – Master.dev Blog&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://devblogs.microsoft.com/devops/copilot-code-reviews-for-azure-repos/&quot;&gt;Copilot Code Reviews for Azure Repos&lt;/a&gt;&lt;br /&gt;
Dan Hellem &amp;amp; Andrew Brenner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/your-agent-just-scaffolded-a-project-from-2020&quot;&gt;Your agent just scaffolded a project from 2020&lt;/a&gt;&lt;br /&gt;
Waldek Mastykarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/review-pull-requests-without-leaving-visual-studio/&quot;&gt;Review pull requests without leaving Visual Studio&lt;/a&gt;&lt;br /&gt;
Tom Pedersen&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/getting-contact-information-net-maui&quot;&gt;Getting Contact Information with .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/natural-language-filtering-maui-grid&quot;&gt;AI-Powered Natural Language Filtering in .NET MAUI DataGrid&lt;/a&gt;&lt;br /&gt;
Shalini Suresh&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-superchip-rtx-spark-puede-nvidia-superar-al-apple-m5-max-en-portatiles.aspx&quot;&gt;El superchip RTX Spark: ¿puede Nvidia superar al Apple M5 Max en portátiles?&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260609-00/?p=112409&quot;&gt;The Microsoft Company Party where everybody played name tag swap&lt;/a&gt;&lt;br /&gt;
Raymond Chen&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/8840370283828284650/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/8840370283828284650' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8840370283828284650'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/8840370283828284650'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/06/enlaces-interesantes-652.html' title='Enlaces interesantes 652'/><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/AVvXsEhFF82EshCMsMsdxXd7ODg1lCb38Po6a1tD0FHJOJT0eQ3Xw3Vh_oGZ-6CHAJjfK5igFvv16OSnxT5ja0D_W52Dk6gF9X1UAguEwkdmwdFwwY8LpsqbP5rRTg05k4E6hreCrEZMGXKneMBcSooAvOSqg10s2jjZ2eDcHKMq5z829bSvulKKvBFjsw/s72-c/national-security.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-1215517495208276324</id><published>2026-06-09T08:00:00.000+02:00</published><updated>2026-06-09T08:00:00.115+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="c#15"/><category scheme="http://www.blogger.com/atom/ns#" term="novedades"/><title type='text'>Tipos unión: la novedad de C# 15 que siempre habías necesitado</title><content type='html'>&lt;img alt=&quot;Distintos tipos de vehículos fusionándose&quot; class=&quot;main-post-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCYFm8XkpiKKHFlRY6J41eKVbAWqy499yJXFX-AYKM-6n4Rq2cQtKzRGt5cVHsBj_vpcrpvU6g_Z22BybAq0cdDBd06iUnrC6CNIypdY53JA7PqRHDXZILb5CcxyWCvYPxY6ST7P-io45TD9oNwntXcZMaigVpAAKWWXhokiSl-XYf4yAZvtDHTQ/s800/union-types.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Todos hemos tenido que lidiar con situaciones en las que una función o método puede devolver diferentes tipos de datos dependiendo de ciertas condiciones. El ejemplo clásico es una función que puede devolver un resultado exitoso o un error, lo que a menudo se maneja con tipos como &lt;code&gt;Result&amp;lt;T&amp;gt;&lt;/code&gt; o haciendo algunos malabarismos con composiciones de clases o herencia.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;var result = GetUser(1);
if(result.Success) 
{
    var user = result.Value;
    // Hacer algo con el usuario
}
else 
{
    var error = result.Error;
    // Manejar el error
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Son artificios que, aunque funcionan, dan trabajo, complican la legibilidad y ocultan la intención real del desarrollador a la hora de escribir código de procedimientos que manejen múltiples tipos de retorno.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Los tipos unión son una de las características más solicitadas en C# durante años&lt;/b&gt;, y finalmente los tendremos disponibles en la versión 15 del lenguaje, que vendrá de la mano de NET 11 en noviembre de 2026.&lt;/p&gt;
&lt;p&gt;Con esta nueva capacidad, podremos crear tipos que pueden contener valores de varios tipos diferentes, con controles en tiempo de compilación y sin apenas complejidad adicional.&lt;/p&gt;
&lt;p&gt;Lo vemos en detalle 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&gt;¿Qué son y cómo se usan los tipos unión?&lt;/h2&gt;
&lt;p&gt;Un tipo unión es un &lt;b&gt;tipo de datos que puede contener valores de diferentes tipos&lt;/b&gt;. Un ejemplo clásico es el escenario que mostrábamos antes, donde una función puede devolver un resultado exitoso o un error. Con los tipos unión, podríamos definir un tipo que puede contener uno de los dos de manera más natural y legible.&lt;/p&gt;
&lt;p&gt;En C#, un tipo unión se implementa mediante la palabra clave &lt;code&gt;union&lt;/code&gt;, que permite definir un tipo de datos cuyas instancias pueden contener valores de uno de los tipos que se hayan especificado. Uf, es difícil de describir, pero seguro lo veremos más claro con unos ejemplos.&lt;/p&gt;
&lt;p&gt;Podríamos definir un tipo unión para representar el resultado de una operación que puede devolver un usuario o un error:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public union GetUserResult (User, Error);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;También podríamos usarlo para agrupar diferentes tipos de vehículos en un solo tipo, sin necesidad de crear abstracciones, como una jerarquía de clases o interfaces:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public union Vehicle (Car, Bike, Truck);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;También podríamos representar un identificador que podría ser un número entero, una cadena o un GUID:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public union ItemIdentifier (int, string, Guid); 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como podréis intuir, no hay ningún límite. El tipo unión puede contener cualquier combinación de tipos, incluso tipos personalizados o tipos genéricos, y que no tengan ninguna relación entre ellos.&lt;/p&gt;
&lt;h2&gt;Uso de tipos unión&lt;/h2&gt;
&lt;p&gt;Una vez creado el tipo unión, &lt;strong&gt;podemos usarlo para declarar variables y asignarles valores de cualquiera de los tipos que lo componen&lt;/strong&gt;, porque el lenguaje permitirá la conversión implícita:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = 123; // Puede ser un entero

id = &quot;abc&quot;; // O una cadena
id = Guid.NewGuid(); // O un GUID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aunque obviamente, no podremos hacerlo al revés. &lt;strong&gt;La conversión implícita solo funciona en un sentido&lt;/strong&gt;, de los tipos incluidos en la unión hacia el tipo unión:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = 123; // Correcto
int intId = id; // Error de compilación, no se puede convertir porque
                // no sabemos el tipo de datos que contiene la variable id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;También, dado que se trata de un tipo de datos normal, podremos &lt;strong&gt;utilizarlo para enviar argumentos o retornar valores de funciones o métodos&lt;/strong&gt;, como vemos en el siguiente ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public union GetUserResult (User, Error);
...
public GetUserResult GetUser(int userId) 
{
     ... // Retorna un objeto User o un objeto Error
} 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fijaos que en este caso, podríamos estar tentados a retornar un &lt;code&gt;object&lt;/code&gt;, pero entonces no tendríamos ningún control en tiempo de compilación, el código sería propenso a errores en tiempo de ejecución y menos legible, porque un consumidor nunca podría deducir qué tipos de datos puede esperar en el retorno. &lt;strong&gt;Usando tipos unión, se realizan comprobaciones en compilación&lt;/strong&gt;, de modo que si desde &lt;code&gt;GetUser()&lt;/code&gt; intentásemos retornar algo que no sea &lt;code&gt;User&lt;/code&gt; o &lt;code&gt;Error&lt;/code&gt;, fallará al compilar, y leyendo la firma del método quedarán claras nuestras intenciones.&lt;/p&gt;
&lt;p&gt;Una vez tenemos un valor de tipo unión, la forma de uso habitual será realizar comparaciones de tipo para poder acceder a su valor y procesarlo adecuadamente. Lo normal en estos casos será utilizar &lt;em&gt;pattern matching&lt;/em&gt;, como en el siguiente ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = GetItemIdentifier(); // Retorna el tipo unión ItemIdentifier
if(id is int intId) 
{
    Console.WriteLine($&quot;El identificador es un entero: {intId}&quot;);
}
else if(id is string strId) 
{
    Console.WriteLine($&quot;El identificador es una cadena: {strId}&quot;);
}
else if(id is Guid guidId) 
{
    Console.WriteLine($&quot;El identificador es un GUID: {guidId}&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sin embargo, lo más habitual será utilizar expresiones &lt;code&gt;switch&lt;/code&gt; para manejar los diferentes casos, como en el siguiente ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = GetItemIdentifier(); // Retorna el tipo unión ItemIdentifier
Console.WriteLine(id switch 
{
    int intId =&amp;gt; $&quot;El identificador es un entero: {intId}&quot;,
    string strId =&amp;gt; $&quot;El identificador es una cadena: {strId}&quot;,
    Guid guidId =&amp;gt; $&quot;El identificador es un GUID: {guidId}&quot;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La ventaja de esta sintaxis, además de ser concisa, es que el compilador puede verificar que se han manejado todos los casos posibles, y si no es así, nos avisará con un &lt;em&gt;warning&lt;/em&gt; de compilación. Por ejemplo, si olvidamos manejar el caso de &lt;code&gt;Guid&lt;/code&gt;, el compilador nos avisará de que no se ha manejado ese tipo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;warning CS8509: The switch expression does not handle all possible values of its input type
(it is not exhaustive). For example, the pattern &#39;System.Guid&#39; is not covered.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como veremos más adelante, los tipos unión generan un &lt;code&gt;struct&lt;/code&gt; que cumple una serie de requisitos. Pero como estructura que es, &lt;strong&gt;también podemos añadirle métodos, propiedades o incluso operadores personalizados&lt;/strong&gt;. Podemos observarlo en el siguiente ejemplo, donde definimos un tipo llamado &lt;code&gt;SingleOrMany&amp;lt;T&amp;gt;&lt;/code&gt; que puede contener un solo valor del tipo &lt;code&gt;T&lt;/code&gt; o una colección de &lt;code&gt;T&lt;/code&gt;s, y que además tiene un método para contar el número de elementos que contiene y otro para obtener los elementos como enumeración:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;SingleOrMany&amp;lt;int&amp;gt; value;
value = 5;
Console.WriteLine($&quot;Count: {value.Count()}&quot;);
Console.WriteLine($&quot;Elements: {string.Join(&quot;, &quot;, value.AsEnumerable())}&quot;);

value = new[] { 1, 2, 3, 4 };
Console.WriteLine($&quot;Count: {value.Count()}&quot;);
Console.WriteLine($&quot;Elements: {string.Join(&quot;, &quot;, value.AsEnumerable())}&quot;);

public union SingleOrMany&amp;lt;T&amp;gt; (T, IEnumerable&amp;lt;T&amp;gt;)
{
    public int Count() 
    {
        if (Value is T) return 1;
        if (Value is IEnumerable&amp;lt;T&amp;gt; collection) return collection.Count();
        return 0;
    }

    public IEnumerable&amp;lt;T&amp;gt; AsEnumerable() 
    {
        return Value switch 
        {
            T single =&amp;gt; [single],
            IEnumerable&amp;lt;T&amp;gt; collection =&amp;gt; collection,
            _ =&amp;gt; []
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cómo funciona esto por debajo?&lt;/h2&gt;
&lt;p&gt;Para poder entender bien esta característica, es importante saber cómo funciona bajo el capó. Vamos a verlo partiendo del tipo &lt;code&gt;ItemIdentifier&lt;/code&gt; que hemos definido algo más arriba:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public union ItemIdentifier (int, string, Guid);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A partir de esta declaración, &lt;b&gt;el compilador de C# se encargará de crear una estructura&lt;/b&gt; llamada &lt;code&gt;ItemIdentifier&lt;/code&gt;, decorada con el atributo &lt;code&gt;[Union]&lt;/code&gt; y que implementa la interfaz &lt;code&gt;IUnion&lt;/code&gt;. El contrato de la interfaz solo obliga a tener una propiedad de lectura &lt;code&gt;Value&lt;/code&gt; de tipo &lt;code&gt;object?&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;public interface IUnion
{
    object? Value { get; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto implica que, en cualquier tipo unión, podremos acceder a la propiedad &lt;code&gt;Value&lt;/code&gt; para obtener el &lt;code&gt;object&lt;/code&gt; que contiene:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = 123;
object? value = id.Value; // value es un object? que contiene el entero 123
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Además de implementar dicha interfaz, la estructura generada proporciona constructores públicos para cada uno de los tipos que forman la unión, de forma que se puedan crear instancias de &lt;code&gt;ItemIdentifier&lt;/code&gt; a partir de cualquiera de sus valores. El código completo generado por el compilador para el tipo unión &lt;code&gt;ItemIdentifier&lt;/code&gt; sería algo así:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;[Union]
public struct ItemIdentifier : IUnion
{
  public object? Value { get; }
  public ItemIdentifier(int value) =&amp;gt; this.Value = (object) value;
  public ItemIdentifier(string value) =&amp;gt; this.Value = (object) value;
  public ItemIdentifier(Guid value) =&amp;gt; this.Value = (object) value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fijaos que en el código no aparecen los operadores de conversión implícita; las conversiones se realizan directamente a través del lenguaje, usando los constructores:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;ItemIdentifier id = 123; // Se llama al constructor ItemIdentifier(int value)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El código que hemos visto arriba es el que genera el compilador por nosotros para los tipos unión declarados en C#, pero nosotros &lt;b&gt;podemos crear tipos unión personalizados siguiendo este mismo patrón&lt;/b&gt; manualmente. Basta con decorar una clase, estructura o registro con el atributo &lt;code&gt;[Union]&lt;/code&gt;, implementar la interfaz &lt;code&gt;IUnion&lt;/code&gt; y proporcionar constructores públicos para cada uno de los tipos que queramos incluir. Por ejemplo, el siguiente código define un tipo unión llamado &lt;code&gt;Vehicle&lt;/code&gt; que puede contener un &lt;code&gt;Car&lt;/code&gt;, una &lt;code&gt;Bike&lt;/code&gt; o un &lt;code&gt;Truck&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;[Union]
public class Vehicle : IUnion
{
    public object? Value { get; }

    public Vehicle(Car value) =&amp;gt; this.Value = (object)value;
    public Vehicle(Bike value) =&amp;gt; this.Value = (object)value;
    public Vehicle(Truck value) =&amp;gt; this.Value = (object)value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta posibilidad puede ser útil en escenarios donde queramos tener un control total sobre la implementación del tipo unión, o cuando queramos incluir lógica adicional en los constructores o en la propiedad &lt;code&gt;Value&lt;/code&gt;. Por ejemplo, dado que por defecto se utiliza un &lt;code&gt;object&lt;/code&gt; para almacenar el valor de la unión, podríamos querer crear una implementación personalizada que evite el sobrecoste del &lt;em&gt;boxing&lt;/em&gt; de tipos de valor.&lt;/p&gt;
&lt;h2&gt;¿Cómo puedo probar los tipos unión?&lt;/h2&gt;
&lt;p&gt;Para poder probar esta nueva característica del lenguaje a día de hoy, lo más sencillo es &lt;a href=&quot;https://dotnet.microsoft.com/es-es/download/dotnet/11.0&quot;&gt;instalar la última versión de .NET 11 Preview&lt;/a&gt;, y habilitar las características preliminares de C# 15. Para ello, basta con añadir el siguiente elemento al archivo &lt;code&gt;.csproj&lt;/code&gt; de nuestro proyecto:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;PropertyGroup&amp;gt;
  &amp;lt;LangVersion&amp;gt;preview&amp;lt;/LangVersion&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En noviembre de 2026, cuando se lance oficialmente .NET 11, esta configuración ya no será necesaria, y podremos usar los tipos unión sin necesidad de habilitar nada, simplemente compilando con el SDK de .NET 11.&lt;/p&gt;
&lt;p&gt;Hay que tener en cuenta que se trata de una característica del lenguaje, por lo que en realidad podría utilizarse en cualquier proyecto .NET, independientemente de su &lt;em&gt;target framework&lt;/em&gt;, siempre que se compile con el SDK de .NET 11. Eso sí, en algunas &lt;em&gt;preview&lt;/em&gt; tempranas de .NET 11 habrá que crear manualmente la interfaz &lt;code&gt;IUnion&lt;/code&gt; y el atributo &lt;code&gt;Union&lt;/code&gt; porque no estarán disponibles de forma nativa en las bibliotecas de clases de .NET.&lt;/p&gt;
&lt;h2&gt;En resumen&lt;/h2&gt;
&lt;p&gt;Los tipos unión son una nueva característica de C# 15 que nos permiten definir tipos de datos que pueden contener valores de diferentes tipos, con controles en tiempo de compilación y sin complicaciones adicionales.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Esta capacidad nos ayudará a escribir código más limpio, legible y seguro, especialmente en escenarios donde una función o método puede devolver diferentes tipos de resultados.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/union&quot; target=&quot;_blank&quot;&gt;https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/union&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/csharp-15-union-types/&quot; target=&quot;_blank&quot;&gt;https://devblogs.microsoft.com/dotnet/csharp-15-union-types/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;&lt;br /&gt;&lt;/div&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/1215517495208276324/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/1215517495208276324' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1215517495208276324'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1215517495208276324'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/06/tipos-union-la-novedad-de-c-15-que.html' title='Tipos unión: la novedad de C# 15 que siempre habías necesitado'/><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/AVvXsEjCYFm8XkpiKKHFlRY6J41eKVbAWqy499yJXFX-AYKM-6n4Rq2cQtKzRGt5cVHsBj_vpcrpvU6g_Z22BybAq0cdDBd06iUnrC6CNIypdY53JA7PqRHDXZILb5CcxyWCvYPxY6ST7P-io45TD9oNwntXcZMaigVpAAKWWXhokiSl-XYf4yAZvtDHTQ/s72-c/union-types.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-1719465302835009367</id><published>2026-06-08T08:02:00.000+02:00</published><updated>2026-06-08T08:02:00.111+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 651</title><content type='html'>&lt;img alt=&quot;Microsoft Build 2026 como un volcán en erupción&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMu4gAmxT9oqTO6mTKfVbLXcO54oU9qNWPk8T7bbiPq5JF4NLHvcv8U4x0OUKT1nUdf1Ujai0Q0y9wrAHS5keBvKa-lnBKX-sMAaPYE0DE5l8wOCDIZrWSrSF7zTni4NNfwQQxt95mXR1XULF-sOAVVz9h835OAdPexgpsqIBHcOSqBNrGiDJWXg/s800/build2026.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;El evento &lt;a href=&quot;https://build.microsoft.com/&quot; target=&quot;_blank&quot;&gt;Microsoft Build 2026&lt;/a&gt; ha sido el gran protagonista de la semana, con tantos anuncios interesantes que cuesta trabajo citar sólo unos pocos: siete nuevos modelos AI propios, el framework UI Reactor, GitHub Copilot para escritorio, novedades en Windows para desarrolladores y plataformas de agentes, una nueva versión del chip cuántico Majorana, Azure Cobalt VM, HorizonDB, Windows NVidia RTX Spark, e incluso un divertido sistema operativo cuyas herramientas se van autogenerando mediante alucinaciones de la IA 😄🤯&lt;/p&gt;
&lt;p&gt;Pero aún así, se han publicado otras muchas cosas que no deberíamos dejar de leer. Por ejemplo, ahora que estamos intentando asimilar el giro brutal de la política de precios de Github Copilot, Bruno Capuano nos &lt;a href=&quot;https://elbruno.com/2026/06/04/github-copilot-and-tokens-how-to-keep-using-ai-without-burning-your-budget-in-three-prompts-some-personal-lessons-learned/&quot;&gt;ofrece consejos basados en su propia experiencia sobre cómo usar GitHub Copilot de forma efectiva&lt;/a&gt;, sin quemar el presupuesto de tokens en un rato. Muy recomendable si usas esta herramienta y quieres sacarle el máximo partido.&lt;/p&gt;
&lt;p&gt;¿&lt;a href=&quot;https://dotnetdigest.com/can-a-net-endpoint-handle-a-million-requests-per-second&quot; target=&quot;_blank&quot;&gt;Puede un endpoint de .NET manejar un millón de solicitudes por segundo&lt;/a&gt;? Patrick Kearns nos cuenta cuáles son los cuellos de botella reales si pretendemos alcanzar ese nivel de rendimiento, y qué podemos hacer para mejorar el rendimiento de nuestras aplicaciones ASP.NET Core.&lt;/p&gt;
&lt;p&gt;Hector Pérez nos muestra cómo &lt;a href=&quot;https://www.telerik.com/blogs/advanced-form-validation-blazor-10&quot; target=&quot;_blank&quot;&gt;aprovechar las nuevas capacidades de validación de formularios en Blazor 10&lt;/a&gt;, con ejemplos prácticos y consejos para mejorar la experiencia de usuario.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.angular.dev/announcing-angular-v22-c52bb83a4664&quot; target=&quot;_blank&quot;&gt;Se ha presentado Angular 22&lt;/a&gt;, con el nuevo Signal Forms, primitivas de accesibilidad, reactividad asíncrona y otras mejoras, muchas enfocadas en facilitar el desarrollo mediante IA.&lt;/p&gt;
&lt;p&gt;Muchos más enlaces a contenidos interesantes de la semana, 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/05/como-obtener-el-nombre-de-la-clase.html&quot;&gt;Cómo obtener el nombre de la clase actual en .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/09/implementacion-por-defecto-en.html&quot;&gt;Implementación por defecto en interfaces de C#8, un primer vistazo&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://microsoft.github.io/microsoft-ui-reactor/&quot;&gt;Microsoft.UI.Reactor: A declarative, component-based C# framework for building WinUI 3 desktop apps&lt;/a&gt;
Microsoft&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build5nines.com/how-to-use-build5nines-sharpvector-with-microsoft-agent-framework-for-local-rag-in-c/&quot;&gt;How to Use Build5Nines.SharpVector with Microsoft Agent Framework for Local RAG in C#&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reflectionit.nl/blog/2026/intro-propertythrowgenerator&quot;&gt;Introducing ReflectionIT.PropertyThrowGenerator - Add compile‑time validated properties to your C# classes with zero boilerplate&lt;/a&gt;&lt;br /&gt;
Fons Sonnemans&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/pointers-in-c-and-memory-safety-span-vs-c-16-unsafe/&quot;&gt;Pointers in C# and Memory Safety: Span vs. C# 16 unsafe&lt;/a&gt;&lt;br /&gt;
NDepend Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://malshikay.medium.com/getting-started-with-claude-in-net-d762b32e8947&quot;&gt;Getting Started with Claude in .NET&lt;/a&gt;&lt;br /&gt;
Yohan Malshika&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://devblogs.microsoft.com/aspire/whats-new-aspire-13-4/&quot;&gt;Aspire 13.4 is here&lt;/a&gt;&lt;br /&gt;
Maddy Montaquila&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnetdigest.com/can-a-net-endpoint-handle-a-million-requests-per-second&quot;&gt;Can a .NET endpoint handle a million requests per second?&lt;/a&gt;&lt;br /&gt;
Patrick Kearns&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/May/31/Lost-ASPNET-Cookies-on-IIS-Restarts&quot;&gt;Lost ASP.NET Identity Cookies on IIS Application Pool Restarts&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/05/30/aspnet-core-web-api-in-net-the-complete-guide&quot;&gt;ASP.NET Core Web API in .NET: The Complete Guide&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/testing/integration-testing-aspnet-core-architect-guide/&quot;&gt;Integration Testing ASP.NET Core APIs with WebApplicationFactory&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/advanced-form-validation-blazor-10&quot;&gt;Advanced Form Validation in Blazor 10&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&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.microsoft.com/en-us/blog/new-azure-cobalt-200-vms-deliver-50-performance-improvement-fully-optimized-for-modern-agentic-ai-workloads/&quot;&gt;New Azure Cobalt 200 VMs deliver 50% performance improvement, fully optimized for modern agentic AI workloads&lt;/a&gt;&lt;br /&gt;
Arun Kishan &amp;amp; Selim Bilgin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/adforpostgresql/azure-horizondb-enterprise-ready-postgres-engineered-for-the-ai-era/4524094&quot;&gt;Azure HorizonDB: Enterprise-Ready Postgres, Engineered for the AI Era&lt;/a&gt;&lt;br /&gt;
Charles Feddersen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/06/01/azcli-enrichederrors.html&quot;&gt;Better Deployment Errors in az webapp deploy&lt;/a&gt;&lt;br /&gt;
Tulika Chaudharie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://azure.github.io/AppService/2026/06/01/sitestatus.html&quot;&gt;Understand What’s Happening with Your App Service for Linux Website Using Site Status&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://www.devleader.ca/2026/05/29/when-to-use-chain-of-responsibility-pattern-in-c-decision-guide-with-examples&quot;&gt;When to Use Chain of Responsibility 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://daily-devops.net/posts/tunit-ai-coding-agents/&quot;&gt;You&#39;re Shipping Bugs Faster, and Your Tests Are Helping&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-age-of-ai/&quot;&gt;The Machine Writes. The Legacy Is Still Mine.&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/40-lessons-i-learned-in-12-years-as-a-dotnet-developer&quot;&gt;40 Lessons I Learned in 12 Years as a .NET Developer&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/modular-monolith-boundaries/&quot;&gt;Modular Monolith Boundaries Done Wrong&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sophielwang.com/blog/jpeg&quot;&gt;JPEG compression&lt;/a&gt;&lt;br /&gt;
Sophie L. Wang&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.roundthecode.com/dotnet-tutorials/pagedresults-ef-core-one-class-endless-reuse&quot;&gt;PagedResults in EF Core: One class, endless reuse&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/pagination-in-ef-core-continued-sortable-grids-htmx-and-the-indexing-cost/&quot;&gt;Pagination in EF Core, Continued: Sortable Grids, htmx, and the Indexing Cost&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://developers.googleblog.com/bringing-gemma-4-12b-to-your-laptop-unlocking-local-agentic-workflows-with-google-ai-edge/&quot;&gt;Bringing Gemma 4 12B to your Laptop: Unlocking Local, Agentic Workflows with Google AI Edge&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://developers.googleblog.com/gemma-4-12b-the-developer-guide/&quot;&gt;Gemma 4 12B: The Developer Guide&lt;/a&gt;&lt;br /&gt;
Google&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/blog/nvidia/cosmos-3-for-physical-ai&quot;&gt;Welcome NVIDIA Cosmos 3: The First Open Omni-model for Physical AI Reasoning and Action&lt;/a&gt;&lt;br /&gt;
Asawaree &amp;amp; Atharva Joshi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.bing.com/search/June-2026/Announcing-Microsoft-Web-IQ&quot;&gt;Announcing Microsoft Web IQ&lt;/a&gt;&lt;br /&gt;
Microsoft&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7NfyZhV1dKM&quot;&gt;VibeOS - Fully Hallucinated Operating System&lt;/a&gt;&lt;br /&gt;
Steve Sanderson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/&quot;&gt;Introducing Microsoft Scout: Your always-on personal agent&lt;/a&gt;&lt;br /&gt;
Omar Shahine&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://microsoft.ai/news/building-a-hillclimbing-machine-launching-seven-new-mai-models/&quot;&gt;Building a hill-climbing machine:&amp;nbsp;Launching seven new MAI models&lt;/a&gt;&lt;br /&gt;
Mustafa Suleyman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/06/04/github-copilot-and-tokens-how-to-keep-using-ai-without-burning-your-budget-in-three-prompts-some-personal-lessons-learned/&quot;&gt;GitHub Copilot and tokens: how to keep using AI without burning your budget in three prompts (some personal lessons learned!)&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/06/01/adaboost-r2-regression-using-csharp.aspx&quot;&gt;AdaBoost.R2 Regression Using C#&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elbruno.com/2026/06/03/mai-image-2-5-support-in-elbruno-text2image-and-the-t2i-cli-%f0%9f%9a%80/&quot;&gt;MAI-Image-2.5 support in ElBruno.Text2Image and the t2i CLI&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/msedgedev/2026/06/02/expanding-on-device-ai-in-microsoft-edge-new-models-and-apis-for-the-web/&quot;&gt;Expanding on‑device AI in Microsoft Edge: New models and APIs for the web&lt;/a&gt;&lt;br /&gt;
Sohum Chatterjee&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://commandline.microsoft.com/agent-control-specification-runtime-governance/&quot;&gt;Agent Control Specification: Portable runtime governance for AI Agents&lt;/a&gt;&lt;br /&gt;
Lisa Brown Jaloza&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://blog.angular.dev/announcing-angular-v22-c52bb83a4664&quot;&gt;Announcing Angular v22&lt;/a&gt;&lt;br /&gt;
Angular&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/blog/web-platform-05-2026?hl=en&quot;&gt;New to the web platform in May&lt;/a&gt;&lt;br /&gt;
Rachel Andrew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/astro-markdown-component-utility-any-framework/&quot;&gt;Astro Markdown Component Utility for Any Framework&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/in-n-out-animations-dialogs-part-1-3/#just-snippet&quot;&gt;In-N-Out Animations: Dialogs (Part 1/3)&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/almanac/pseudo-selectors/s/search-text/&quot;&gt;::search-text&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/qodana/2026/06/fix-common-typescript-issues/&quot;&gt;Fix Common TypeScript Issues&lt;/a&gt;&lt;br /&gt;
Elizaveta Myšáková&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/another-stab-at-the-perfect-css-pie-chart-sans-javascript/&quot;&gt;Another Stab at the Perfect CSS Pie Chart... Sans JavaScript!&lt;/a&gt;&lt;br /&gt;
Antoine Villepreux&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/almanac/rules/f/function/&quot;&gt;@function&lt;/a&gt;&lt;br /&gt;
Declan Chidlow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/almanac/properties/o/offset-path/&quot;&gt;offset-path&lt;/a&gt;&lt;br /&gt;
Geoff Graham&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/obscuring-text-with-counter-style/&quot;&gt;Obscuring Text with @counter-style&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://frontendmasters.com/blog/word-rotator-with-counter-style/&quot;&gt;Word Rotator with @counter-style&lt;/a&gt;&lt;br /&gt;
Preethi Sam&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/05/como-crear-un-status-line-personalizado-para-github-copilot-cli/&quot;&gt;Cómo crear un status line personalizado para GitHub Copilot CLI&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/commandline/announcing-intelligent-terminal-version-0-1/&quot;&gt;Announcing Intelligent Terminal 0.1&lt;/a&gt;&lt;br /&gt;
Anas Mazouni&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mitchelsellers.com/blog/article/github-copilot-credit-based-usage-is-live-now-what&quot;&gt;GitHub Copilot Credit Based Usage Is Live&lt;/a&gt;&lt;br /&gt;
Mitchel Sellers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/whats-coming-next-in-visual-studio-our-microsoft-build-2026-announcements/&quot;&gt;What&#39;s Coming Next in Visual Studio: Our Microsoft Build 2026 Announcements&lt;/a&gt;&lt;br /&gt;
Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.j2i.net/2026/06/02/keeping-the-computer-awake/&quot;&gt;Keeping the Computer&amp;nbsp;Awake&lt;/a&gt;&lt;br /&gt;
Joel Ivory Johnson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/news-insights/product-news/github-copilot-app-the-agent-native-desktop-experience/&quot;&gt;GitHub Copilot app: The agent-native desktop experience&lt;/a&gt;&lt;br /&gt;
Mario Rodriguez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/devops/how-microsoft-is-migrating-repositories-to-github/&quot;&gt;How Microsoft is migrating repositories to GitHub&lt;/a&gt;&lt;br /&gt;
Grant Trimble&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/devops/azure-devops-and-github-journeying-into-the-ai-era/&quot;&gt;Azure DevOps and GitHub: Journeying into the AI Era&lt;/a&gt;&lt;br /&gt;
Tim Chermin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/visual-studio-2026-6-months-later&quot;&gt;Visual Studio 2026, 6 Months Later&lt;/a&gt;&lt;br /&gt;
Dave Brock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/windowsdeveloper/2026/06/02/build-2026-furthering-windows-as-the-trusted-platform-for-development/&quot;&gt;Build 2026: Furthering Windows as the trusted platform for development&lt;/a&gt;&lt;br /&gt;
Pavan Davuluri, Executive Vice President, Windows + Devices&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/nested-listview-dotnet-maui&quot;&gt;Why Nested ListView Breaks Down Faster Than You Expect in .NET MAUI&lt;/a&gt;&lt;br /&gt;
Anandh Ganesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/5-heart-animations-using-net-maui&quot;&gt;5 Heart Animations Using .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.returngis.net/2026/06/100-000-gracias-developers-%e2%9d%a4%ef%b8%8f/&quot;&gt;100.000 gracias, developers ❤️&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;br /&gt;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;&lt;b&gt;¡¡Enhorabuena!!&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.microsoft.com/quantum-majorana-2/&quot;&gt;Microsoft’s Majorana 2 is here&lt;/a&gt;&lt;br /&gt;
Catherine Bolgar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/windowsexperience/2026/05/31/introducing-a-powerful-new-chapter-for-windows-pcs-accelerated-by-nvidia-rtx-spark/&quot;&gt;Introducing a powerful new chapter for Windows PCs, accelerated by NVIDIA RTX Spark&lt;/a&gt;&lt;br /&gt;
Pavan Davuluri&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-released/&quot;&gt;Elixir v1.20 released: now a gradually typed language&lt;/a&gt;&lt;br /&gt;
José Valim&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260601-00/?p=112373&quot;&gt;The placeholder name for the Windows 8 experience was &quot;modern&quot;&lt;/a&gt;&lt;br /&gt;
Raymond Chen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mteheran.dev/coding-isnt-fun-anymore-and-maybe-that-s-okay-3d4722628330&quot;&gt;Coding Isn’t Fun Anymore — And Maybe That’s Okay&lt;/a&gt;&lt;br /&gt;
Miguel Teherá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/1719465302835009367/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/1719465302835009367' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1719465302835009367'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1719465302835009367'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/06/enlaces-interesantes-651.html' title='Enlaces interesantes 651'/><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/AVvXsEgMu4gAmxT9oqTO6mTKfVbLXcO54oU9qNWPk8T7bbiPq5JF4NLHvcv8U4x0OUKT1nUdf1Ujai0Q0y9wrAHS5keBvKa-lnBKX-sMAaPYE0DE5l8wOCDIZrWSrSF7zTni4NNfwQQxt95mXR1XULF-sOAVVz9h835OAdPexgpsqIBHcOSqBNrGiDJWXg/s72-c/build2026.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-4014942704904635924</id><published>2026-06-01T08:00:00.000+02:00</published><updated>2026-06-01T08:00:00.114+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 650</title><content type='html'>&lt;img alt=&quot;Programador desesperado por lo que le dejó su yo del pasado&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaeyhDbuMHv6Hbs_uhCfL6Sk5v_hEAfUwI4mODxUiBb8XrUgtuMH0M33xHHwD1wj23OUh8FjZfnuzsT_nDGuJtokhGe7BC1M6v-zWkN3J1T1pay7hRQw1AHf1tlaAOMirhroJlpCTb8R94eFC8J-nMp2BaIt_phtTpe6zRc5rzEP8r3n0314a8bg/s800/future-yo.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Mientras programamos, todos hemos dicho alguna vez &quot;voy a tomar este atajo&quot;, &quot;ya lo solucionaré en el futuro&quot;, &quot;lo dejo &lt;i&gt;hardcodeado&lt;/i&gt; por ahora&quot;... y el código se queda así para siempre. Viene bien reflexionar sobre lo que estas decisiones implican, como las reflexiones de Martin Stühmer sobre lo crueles que somos a veces con nuestro yo del futuro, en un par de posts con títulos muy ilustrativos:&amp;nbsp;&lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-past-self/&quot; target=&quot;_blank&quot;&gt;My biggest enemy writes my code&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-empty-promises/&quot; target=&quot;_blank&quot;&gt;I’m done making empty promises&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Interesante también el artículo de Fran Iglesias explicando cómo usar métricas objetivas —no solo intuiciones o “elegancia”— para decidir cuándo y cómo &lt;a href=&quot;https://franiglesias.github.io/metric-driven-refactoring/&quot; target=&quot;_blank&quot;&gt;refactorizar código con el fin de reducir costes de mantenimiento y mejorar la calidad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Agentes, agentes IA everywhere... Pero, ¿cómo funcionan por detrás los agentes IA? En este post de Waldek Mastykarz nos explica &lt;a href=&quot;https://developer.microsoft.com/blog/how-ai-coding-agents-actually-use-your-technology&quot; target=&quot;_blank&quot;&gt;el flujo de trabajo un agente&lt;/a&gt; para que podamos comprenderlo de forma sencilla.&lt;/p&gt;
&lt;p&gt;También, Chris Pietschmann nos lleva de nuevo a las bases para revisar &lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/24/csharp-should-this-service-be-singleton-scoped-or-transient&quot; target=&quot;_blank&quot;&gt;los ámbitos de vida de servicios en .NET&lt;/a&gt; (Singleton, Scoped y Transient) y entender cuándo usar cada uno de ellos.&lt;/p&gt;&lt;p&gt;Muchos más enlaces 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/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;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/07/tipos-referencia-anulables-en-c-8.html&quot;&gt;Tipos referencia anulables en C# 8&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.developerro.com/2026/05/27/no-build-service-provider/&quot;&gt;No llames a &lt;code&gt;BuildServiceProvider()&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xaml.dev/post/automatically-getting-api-difference-diagrams-in-your-net-prs&quot;&gt;Automatically getting API difference diagrams in your .NET PRs&lt;/a&gt;&lt;br /&gt;
Morten Nielsen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/24/csharp-should-this-service-be-singleton-scoped-or-transient&quot;&gt;C#: Should This Service Be Singleton, Scoped, or Transient?&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thomasclaudiushuber.com/2026/05/22/the-support-length-for-net-lts-and-sts-versions/&quot;&gt;The Support Length for .NET LTS and STS versions – Thomas Claudius Huber&lt;/a&gt;&lt;br /&gt;
Thomas Claudius Huber&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/24/csharp-when-should-you-use-exceptions-result-objects-validation-errors&quot;&gt;In C#, When Should You Use Exceptions, Result Objects, or Validation Errors?&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.code4it.dev/python-for-dotnet-developers/data-types-classes-objects-records-interfaces/&quot;&gt;Python for .NET devs: data types, classes, objects, records and interfaces&lt;/a&gt;&lt;br /&gt;
Davide Bellone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/c-nullable-types-explained/&quot;&gt;C# Nullable Types Explained (2026)&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://blog.elmah.io/designing-high-throughput-apis-for-1m-requests-minute-net/&quot;&gt;Designing high-throughput APIs for 1M requests/minute .NET&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/May/26/Running-ASPNET-Core-Applications-in-an-IIS-Subfolder-Application&quot;&gt;Running ASP.NET Core Applications as a Subfolder Application&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/blazor-file-manager-ai-summary-organization&quot;&gt;AI-Powered Content Summarization and File Organization in Blazor File Manager&lt;/a&gt;&lt;br /&gt;
Keerthana Rajendran&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://franiglesias.github.io/metric-driven-refactoring/&quot;&gt;Refactoring dirigido por métricas&lt;/a&gt;&lt;br /&gt;
Fran Iglesias&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-past-self/&quot;&gt;My Biggest Enemy Writes My Code&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy-empty-promises/&quot;&gt;I&#39;m Done Making Empty Promises&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/how-to-scale-long-running-api-requests&quot;&gt;How to Scale Long-Running API Requests&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://www.roundthecode.com/dotnet-tutorials/ef-core-without-migrations-its-only-a-matter-of-time&quot;&gt;EF Core without migrations - it&#39;s only a matter of time&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/05/using-executionlog-views-in-sql-server.html&quot;&gt;Using ExecutionLog views in SQL Server Reporting Services to monitor performance&lt;/a&gt;&lt;br /&gt;
Bart Wullems&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://woodruff.dev/pagination-in-entity-framework-core-why-skip-take-falls-apart-on-hot-tables/&quot;&gt;Pagination in Entity Framework Core: Why Skip/Take Falls Apart on Hot Tables&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bartwullems.blogspot.com/2026/05/ef-core-10smarter-parameterized.html&quot;&gt;EF Core 10–Smarter parameterized collections&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://www.anthropic.com/news/claude-opus-4-8&quot;&gt;Introducing Claude Opus 4.8&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shbhmrzd.github.io/ai/ml-foundations/llm-training/2026/05/27/how-llms-process-text.html&quot;&gt;How LLMs Work, Part 1: How LLMs Process Text&lt;/a&gt;&lt;br /&gt;
Shubham Raizada&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/how-ai-coding-agents-actually-use-your-technology&quot;&gt;How AI coding agents actually use your technology&lt;/a&gt;&lt;br /&gt;
Waldek Mastykarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/anatomy-of-an-open-source-ai-coding-agent-built-in-net-codealta/&quot;&gt;Anatomy of an Open-Source AI Coding Agent Built in .NET: CodeAlta&lt;/a&gt;&lt;br /&gt;
NDepend Team&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/cross-document-view-transitions-part-2/&quot;&gt;Cross-Document View Transitions: Scaling Across Hundreds of Elements&lt;/a&gt;&lt;br /&gt;
Durgesh Rajubhai Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/revealing-text-with-css-letter-spacing/&quot;&gt;Revealing Text With CSS letter-spacing&lt;/a&gt;&lt;br /&gt;
Preethi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/managing-anchor-associations-with-data-attributes-and-advanced-attr/&quot;&gt;Managing Anchor Associations With Data Attributes and Advanced attr()&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://latish.dev/blog/2026/05/27/measuring-performance-in-frontend-using-fps/&quot;&gt;Measuring Performance in FrontEnd using FPS — Latish Sehgal&lt;/a&gt;&lt;br /&gt;
Latish Sehgal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/05/building-self-correcting-color-systems-contrast-color/&quot;&gt;Algorithmic Theming Engines: Building Self-Correcting Color Systems With contrast-color()&lt;/a&gt;&lt;br /&gt;
Durgesh Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/search&quot;&gt;&amp;lt;search&amp;gt;: HTML generic search element&lt;/a&gt;&lt;br /&gt;
MDN&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-12/&quot;&gt;What’s !important&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-fundamentals-and-dev-experience-of-css-function/&quot;&gt;The Fundamentals and Dev Experience of CSS @function&lt;/a&gt;&lt;br /&gt;
Jane Ori&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/articles/how-to-add-icons-to-external-links-with-css/&quot;&gt;How to add icons to external links with CSS&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&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/dotnet/doing-more-with-github-copilot/&quot;&gt;Doing More with GitHub Copilot as a .NET Developer&lt;/a&gt;&lt;br /&gt;
Wendy Breiding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-may-update-plan-review-refine/&quot;&gt;Visual Studio May Update – Plan, Review, Refine&lt;/a&gt;&lt;br /&gt;
Mark Downie&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.horus.com.uy/blog/net-maui-changes-its-engine-what-it-means-for-your-mobile-app&quot;&gt;.NET MAUI changes its engine: what it means for your mobile app&lt;/a&gt;&lt;br /&gt;
Sebastián Cabrera&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-maui-material-3/&quot;&gt;Give Your .NET MAUI Android Apps a Material 3 Makeover&lt;/a&gt;&lt;br /&gt;
Gerald Versluis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/share-functionality-net-maui-apps&quot;&gt;Share Functionality in Your .NET MAUI Apps&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.elladodelmal.com/2026/05/un-rato-con-mi-amigo-jose-manuel.html&quot;&gt;Un informático en el lado del mal: Un rato con mi amigo José Manuel Alarcón de CampusMVP&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/technical-writing-in-the-ai-age/&quot;&gt;Technical Writing in the AI Age&lt;/a&gt;&lt;br /&gt;
Geoff Graham&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/4014942704904635924/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/4014942704904635924' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4014942704904635924'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/4014942704904635924'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/06/enlaces-interesantes-650.html' title='Enlaces interesantes 650'/><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/AVvXsEjaeyhDbuMHv6Hbs_uhCfL6Sk5v_hEAfUwI4mODxUiBb8XrUgtuMH0M33xHHwD1wj23OUh8FjZfnuzsT_nDGuJtokhGe7BC1M6v-zWkN3J1T1pay7hRQw1AHf1tlaAOMirhroJlpCTb8R94eFC8J-nMp2BaIt_phtTpe6zRc5rzEP8r3n0314a8bg/s72-c/future-yo.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-1842248561462320400</id><published>2026-05-26T08:01:00.000+02:00</published><updated>2026-05-26T08:57:14.582+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><category scheme="http://www.blogger.com/atom/ns#" term="visualstudio"/><title type='text'>Filtros de solución en Visual Studio y .NET (.slnf)</title><content type='html'>&lt;img alt=&quot;Técnicos trabajando sobre partes específicas de un proyecto complejo&quot; class=&quot;main-post-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN8Sa8QxS5S0WQO05SwI10_olhA7hhReZw24zAX6n0wF4F1k-BXwZK5TgOwPsfA1GLiefFlj6eyGRDgyDbcBEQtf7Jdlc4yFb8Xzn_8-HgAbGK5CBX5ums2gk0AP_mHZx88QxKkYbhWAIjbzqsq5tVZnRjDWLARjINdBYo-KTKX2wiwxtIzDX27Q/s800/solution-filters.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Probablemente alguna vez habréis trabajado en Visual Studio con una solución .NET enorme, con decenas o centenares de proyectos. Es algo habitual en sistemas que tienen ya muchos años de vida, con una arquitectura muy compleja o que han ido creciendo con el tiempo sin un control adecuado.&lt;/p&gt;
&lt;p&gt;En estos casos, el entorno de desarrollo tarda una eternidad en cargar la solución y quedar listo para su uso, el rendimiento de Visual Studio se resiente enormemente, con lo que cada acción que realicemos (compilar, ejecutar, depurar, etc.) se vuelve lenta y frustrante, y encima, al navegar por el código, todo se complicará bastante por la cantidad de proyectos y archivos que tendremos que manejar.&lt;/p&gt;
&lt;p&gt;Y lo peor de todo es que es para nada. En la mayoría de los casos no es necesario tener todos los proyectos de la solución cargados para poder realizar nuestras tareas, porque lo habitual es que solo trabajemos con un subconjunto de ellos, normalmente bastante pequeño.&lt;/p&gt;
&lt;p&gt;Afortunadamente, .NET permite crear filtros de solución (archivos .slnf), algo así como mini-soluciones que incluyen solo los proyectos que nos interesan en cada ocasión, mejorando el rendimiento de los entornos de desarrollo y facilitando la navegación por el código.&lt;/p&gt;
&lt;p&gt;En este artículo vamos a ver qué son los filtros de solución, cómo crearlos y cómo usarlos.&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é son los filtros de solución?&lt;/h2&gt;
&lt;p&gt;Los filtros de solución fueron introducidos hace ya unos años, con Visual Studio 2019 y .NET Core 3.1. Se trata de una forma de crear  vistas personalizadas de una solución donde solo se incluyen los proyectos con los que queremos trabajar en cada momento.&lt;/p&gt;
&lt;p&gt;En la práctica, son simples archivos de JSON con extensión &lt;code&gt;.slnf&lt;/code&gt; que contienen una referencia a una solución normal (archivo &lt;code&gt;.sln&lt;/code&gt; o &lt;code&gt;.slnx&lt;/code&gt;) y la lista de proyectos que queremos incluir en el filtro. Una vez creados, podemos abrir estos archivos directamente desde Visual Studio o nuestro editor favorito, y &lt;strong&gt;solo cargarán los proyectos que hayamos incluido en el filtro&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Como ejemplo, a continuación se muestra el contenido de un filtro de solución, llamado &lt;code&gt;OneToFour.slnf&lt;/code&gt;, que incluye solo los proyectos 1, 2, 3 y 4 de una solución con 300 proyectos llamada &lt;code&gt;VeryBigSolution.slnx&lt;/code&gt; (vale, quizás es un escenario algo exagerado, pero sirve para ilustrar la idea):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;solution&quot;: {
    &quot;path&quot;: &quot;VeryBigSolution.slnx&quot;,
    &quot;projects&quot;: [
      &quot;Project01/Project01.csproj&quot;,
      &quot;Project02/Project02.csproj&quot;,
      &quot;Project03/Project03.csproj&quot;,
      &quot;Project04/Project04.csproj&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Imaginaos el cambio que supone manejar solo 4 proyectos en lugar de los 300 que tiene la solución original. La carga de la solución en Visual Studio será mucho más rápida, así como el rendimiento general del entorno de desarrollo y las acciones habituales que realizamos en él, como compilar, ejecutar, depurar, navegar por el código, etc.&lt;/p&gt;
&lt;p&gt;
  &lt;img alt=&quot;Solución filtrada con 4 proyectos de 300&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHbSLbkCg_BrLv-cgKrcUywBagjSLYlpJ-tiku-iVG261c-2sAzFVn7dURIUbNElKOlmPyuUi6IYQ7aitmzqNx-v9VfdMbtIKgf6fitkQQxG0-j3POcSeKyOZD0F3BFf0L5AdWYOtTRgDQhsQ05EiDHLF3dVB-TcJyiw_a98ehttAoAe4mrNjpEQ/s405/onetofour.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Los archivos &lt;code&gt;.slnf&lt;/code&gt; son &lt;strong&gt;soportados también a nivel de &lt;em&gt;framework&lt;/em&gt;&lt;/strong&gt; desde .NET Core 3.1, lo que quiere decir que podemos lanzar comandos de CLI como &lt;code&gt;dotnet build&lt;/code&gt;, &lt;code&gt;dotnet test&lt;/code&gt;, o incluso &lt;code&gt;msbuild&lt;/code&gt; apuntando a un archivo de filtro de solución, y se ejecutarán solo con los proyectos que estén incluidos en dicho filtro.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;D:\Projects\VeryBigSolution&amp;gt;dotnet build OneToFour.slnf
Restore complete (0,6s)
  Project03 net10.0 succeeded (0,1s) → Project03\bin\Debug\net10.0\Project03.dll
  Project02 net10.0 succeeded (0,1s) → Project02\bin\Debug\net10.0\Project02.dll
  Project04 net10.0 succeeded (0,2s) → Project04\bin\Debug\net10.0\Project04.dll
  Project01 net10.0 succeeded (0,2s) → Project01\bin\Debug\net10.0\Project01.dll

Build succeeded in 1,1s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En realidad, es parecido a lo que conseguiríamos creando soluciones normales (&lt;code&gt;.sln&lt;/code&gt;/&lt;code&gt;.slnx&lt;/code&gt;) con distintos subconjuntos de proyectos. Sin embargo, si lo hiciéramos de esta forma, tendríamos que encargarnos de gestionar varias soluciones, con sus configuraciones, perfiles y otras cosas; en cambio, con los filtros de solución, solo tenemos que mantener una solución normal y varios archivos de filtro que la referencien, por lo que todo será más sencillo y fácil de mantener.&lt;/p&gt;
&lt;p&gt;Por ultimo, es conveniente aclarar que por cada solución podemos tener tantos archivos &lt;code&gt;.slnf&lt;/code&gt; como queramos, cada uno con un subconjunto diferente de proyectos. De esta forma, podríamos tener un filtro para cada área funcional del sistema, para cada equipo de desarrollo, para cada tarea concreta que tengamos que realizar, etc.&lt;/p&gt;
&lt;h2&gt;¿Cómo crear un filtro de solución?&lt;/h2&gt;
&lt;p&gt;Al tratarse de archivos &lt;code&gt;.json&lt;/code&gt;, bastaría con crearlos manualmente con un editor de texto cualquiera, siempre que sigamos la estructura que hemos visto antes.&lt;/p&gt;
&lt;p&gt;Sin embargo, Visual Studio también nos ofrece una forma muy sencilla de crearlos a través del entorno gráfico. Para ello, lo único que tenemos que hacer es abrir la solución normal (archivo &lt;code&gt;.sln&lt;/code&gt; o &lt;code&gt;.slnx&lt;/code&gt;), usar el menú contextual del Explorador de Soluciones para descargar los proyectos que no nos interesen, y finalmente ir a &lt;code&gt;Archivo &amp;gt; Guardar como solución filtrada...&lt;/code&gt; y elegir un nombre para el nuevo filtro de solución.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Salvar un subconjunto de proyectos como filtro de solución&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIEwXtqHVEuWQuGJ1Y7Clmmdrw_BZnCuzP2fdrYRo-b5aQCAZGnybOIYeCXcRckHWBmkbCfqCdZdKHQ6VJpLG5lqSyhv1yyAXw8YjFez9RxDDsGNs71p_Ngoon33n1AyClX3gNjzyK4B47PofELoa_JMbvSk28wGNUh64ZqJsUXLp1lEWrB4sZDg/s1338/save-as-solution-filter.png&quot; width=&quot;80%&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A partir de aquí, ya la cosa pasa a ser completamente artesana. Si queremos añadir nuevos proyectos al filtro o eliminar algunos existentes, tendremos que retocar el archivo &lt;code&gt;.slnf&lt;/code&gt; manualmente, o bien volver a generarlo desde Visual Studio siguiendo el procedimiento descrito antes.&lt;/p&gt;&lt;p&gt;¡Espero que os resulte útil!&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/1842248561462320400/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/1842248561462320400' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1842248561462320400'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/1842248561462320400'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/05/filtros-de-solucion-en-visual-studio-y.html' title='Filtros de solución en Visual Studio y .NET (.slnf)'/><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/AVvXsEjN8Sa8QxS5S0WQO05SwI10_olhA7hhReZw24zAX6n0wF4F1k-BXwZK5TgOwPsfA1GLiefFlj6eyGRDgyDbcBEQtf7Jdlc4yFb8Xzn_8-HgAbGK5CBX5ums2gk0AP_mHZx88QxKkYbhWAIjbzqsq5tVZnRjDWLARjINdBYo-KTKX2wiwxtIzDX27Q/s72-c/solution-filters.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-5449924744766004764</id><published>2026-05-25T08:00:00.000+02:00</published><updated>2026-05-25T08:00:00.117+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 649</title><content type='html'>&lt;img alt=&quot;Manitas realizando cálculos complejos para intentar alinear un cuadro con otro&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3oYonELPBTnW8YGsoyzMH1GX-nQnQG5OwgEbMJZMAugM_lzdImFn71QRfoG1V0iR_pi_wpdxEpp9TlTB7gPYsy3q3iSDN0QVxsuPuqGzn0Ex23Vy5W0NlzLEtQlSvgxdzLWNxp1RG50jLfmTdKhiIuwhJig8FqOkgMz8g-KMrNF5SCau872NdpA/s800/anchor-positioning.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Esta semana se ha lanzado Gemini 3.5 Flash, la nueva versión de los modelos de lenguaje de Google, con mejoras significativas en rendimiento y capacidades. José Manuel Alarcón analiza &lt;a href=&quot;https://www.campusmvp.es/recursos/post/gemini-3-5-flash-que-cambia-de-verdad-para-desarrolladores.aspx&quot; target=&quot;_blank&quot;&gt;qué cambios trae esta actualización para los desarrolladores&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hay casos de uso que funcionan bien y otros que fallan, pero, ¿qué ocurre con los que funcionan a medias? En este artículo, Milan Jovanović analiza cómo &lt;a href=&quot;https://www.milanjovanovic.tech/blog/when-your-use-case-half-succeeds-designing-for-partial-failure-in-dotnet&quot; target=&quot;_blank&quot;&gt;diseñar para el fallo parcial en .NET&lt;/a&gt;, explorando estrategias para manejar situaciones donde una operación no se completa en su totalidad.&lt;/p&gt;
&lt;p&gt;Martin Stühmer nos recuerda que &lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy/&quot; target=&quot;_blank&quot;&gt;el código que escribimos hoy puede convertirse en un problema&lt;/a&gt; para otros, o incluso nosotros mismos, en el futuro, destacando la importancia de escribir código limpio y mantenible.&lt;/p&gt;
&lt;p&gt;El posicionamiento en CSS ha sido un desafío para los desarrolladores durante mucho tiempo, especialmente al intentar mostrar tooltips relativos a elementos del DOM. Manikanda Akash Munisamy explora cómo &lt;a href=&quot;https://www.syncfusion.com/blogs/post/css-anchor-positioning&quot; target=&quot;_blank&quot;&gt;los anchors en CSS&lt;/a&gt; podrían poner fin a los cálculos manuales para alinear estos elementos.&lt;/p&gt;
&lt;p&gt;Y por último, me ha parecido interesante compartir este artículo de Barry Pollard y Noam Rosenthal sobre las &lt;a href=&quot;https://developer.chrome.com/blog/declarative-partial-updates&quot; target=&quot;_blank&quot;&gt;actualizaciones parciales declarativas en Chrome&lt;/a&gt;, una nueva característica que permite a los desarrolladores actualizar solo partes específicas de una página web sin necesidad de recargar toda la página, mejorando así la experiencia del usuario.&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/04/comparacion-natural-de-cadenas-en-net-10.html&quot;&gt;Comparación natural de cadenas en .NET 10&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/07/null-coalescing-assigment-el-nuevo.html&quot;&gt;Null coalescing assigment &quot;??=&quot;, el nuevo operador de asignación en C# 8&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/nuget-package-pruning-in-dotnet-10/&quot;&gt;NuGet Package Pruning: Cleaner Dependencies and Actionable Vulnerability Reports&lt;/a&gt;&lt;br /&gt;
Nikolche Kolev&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/6066abb6-640a-4225-ac33-3f4d5a1a1d16&quot;&gt;Zstandard compression in .NET 11&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/exploring-the-dotnet-11-preview-2-dotnet-gets-union-types/&quot;&gt;.NET finally gets union types🎉&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kant2002.github.io/en/obfuscators/2026/05/20/how-to-build-obfuscator-part-iii.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/improving-csharp-memory-safety/&quot;&gt;Improving C# Memory Safety&lt;/a&gt;&lt;br /&gt;
Jaren Duan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-agent-governance-toolkit-mcp-extensions-for-dotnet/&quot;&gt;Announcing Agent Governance Toolkit MCP Extensions for .NET&lt;/a&gt;&lt;br /&gt;
Jack Batzner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/your-ilogger-is-lying-to-you/&quot;&gt;Six Ways ILogger Silently Fails in Production&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/05/21/reflection-performance-in-net-10-benchmarks-caching-and-delegates&quot;&gt;Reflection Performance in .NET 10: Benchmarks, Caching, and Delegates&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 / Aspire&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/open-source-syncfusion-toolkit-for-blazor&quot;&gt;Introducing Syncfusion Toolkit for Blazor: Free Open-Source Blazor Components&lt;/a&gt;&lt;br /&gt;
Saravanan G.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/blazor-how-to-set-a-base-component-for-all-razor-components-using-viewstart-razo.htm&quot;&gt;Blazor - How to set a base component for all Razor components&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/how-to-upload-files-in-an-asp-net-core-web-api/&quot;&gt;How to upload files in an ASP.NET Core Web API&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/migrate-from-asp-net-to-asp-net-core/&quot;&gt;How to Migrate from ASP.NET Framework to ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Gopinath Karunanithi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/aspire/dev-loop-tribal-knowledge/&quot;&gt;Your dev loop is full of tribal knowledge&lt;/a&gt;&lt;br /&gt;
David Fowler&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://devblogs.microsoft.com/foundry/how-to-run-evals-for-model-router/&quot;&gt;How to run evals for the model router&lt;/a&gt;&lt;br /&gt;
Sanjeev Jagtap&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.milanjovanovic.tech/blog/when-your-use-case-half-succeeds-designing-for-partial-failure-in-dotnet&quot;&gt;When Your Use Case Half-Succeeds: Designing for Partial Failure in .NET&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/code-as-legacy/&quot;&gt;The Code You Write Today Is Someone&#39;s Problem Tomorrow&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.couchbase.com/blog/json-database/&quot;&gt;What Is a JSON Database and Why Are They Useful?&lt;/a&gt;&lt;br /&gt;
Matthew Groves&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/databases/sql-server/t-sql-programming-sql-server/demystifying-pivot-and-unpivot-in-t-sql/&quot;&gt;Demystifying PIVOT and UNPIVOT in T-SQL&lt;/a&gt;&lt;br /&gt;
Edward Pollack&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/rinat_kozin_d0a2ef43e7824/two-tables-zero-migrations-full-linq-a-net-data-engine-thats-been-running-our-production-for-2482&quot;&gt;An EF Core alternative for .NET apps with complex object graphs — full LINQ, no migrations, no DbContext&lt;/a&gt;&lt;br /&gt;
Rinat Kozin&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-3-5-flash-que-cambia-de-verdad-para-desarrolladores.aspx&quot;&gt;Gemini 3.5 Flash: qué cambia de verdad para desarrolladores&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campusmvp.es/recursos/post/npu-vs-gpu-que-son-en-que-se-diferencian-y-cual-necesitas-segun-lo-que-programes.aspx&quot;&gt;NPU vs GPU: qué son, en qué se diferencian y cuál necesitas según lo que programes&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/&quot;&gt;Gemini 3.5: frontier intelligence with action&lt;/a&gt;&lt;br /&gt;
Koray Kavukcuoglu &amp;amp; Jeff Dean &amp;amp; Oriol Vinyals &amp;amp; Noam Shazeer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/&quot;&gt;Introducing Gemini Omni&lt;/a&gt;&lt;br /&gt;
Koray Kavukcuoglu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/agentic-agile-why-agent-development-needs-agile-not-just-prompts&quot;&gt;Agentic-Agile: Why Agent Development Needs Agile (Not Just Prompts)&lt;/a&gt;&lt;br /&gt;
Neil Van Heukelem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pmichaels.net/introduction-to-lm-studio/&quot;&gt;Introduction to LM Studio&lt;/a&gt;&lt;br /&gt;
Paul Michaels&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.syncfusion.com/blogs/post/css-anchor-positioning&quot;&gt;CSS Anchor Positioning: The End of Manual Tooltip Calculations?&lt;/a&gt;&lt;br /&gt;
Manikanda Akash Munisamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/cross-document-view-transitions-part-1/&quot;&gt;Cross-Document View Transitions: The Gotchas Nobody Mentions&lt;/a&gt;&lt;br /&gt;
Durgesh Rajubhai Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/typescript-utility-types-probably-underusing/&quot;&gt;TypeScript utility types you&#39;re probably underusing&lt;/a&gt;&lt;br /&gt;
Muhammed Ali&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/&quot;&gt;Moving away from Tailwind, and learning to structure my CSS&lt;/a&gt;&lt;br /&gt;
Julia Evans&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/typescript-v6-migration-guide/&quot;&gt;TypeScript v6 is here: A full migration guide&lt;/a&gt;&lt;br /&gt;
Amazing Enyichi Agu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/engineering/architecture-optimization/from-latency-to-instant-modernizing-github-issues-navigation-performance/&quot;&gt;From latency to instant: Modernizing GitHub Issues navigation performance&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csswizardry.com/2026/05/better-browser-caching-with-no-vary-search/&quot;&gt;Better Browser Caching with No-Vary-Search&lt;/a&gt;&lt;br /&gt;
Harry Roberts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/05/mathematical-layouts-sibling-index-sibling-count/&quot;&gt;Advanced Tree Counting: Mathematical Layouts With sibling-index() And sibling-count()&lt;/a&gt;&lt;br /&gt;
Durgesh Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patrickbrosset.com/articles/2026-05-20-whats-missing-in-css-layout/&quot;&gt;What&#39;s missing in CSS layout&lt;/a&gt;&lt;br /&gt;
Patrick Brosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/declarative-partial-updates&quot;&gt;Declarative partial updates&lt;/a&gt;&lt;br /&gt;
Barry Pollard &amp;amp; Noam Rosenthal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/choose-css-selectors-for-production&quot;&gt;Choosing CSS Selectors for Production: Specificity, Modern Pseudo-Classes, and Maintainable Styles&lt;/a&gt;&lt;br /&gt;
Arunachalam Kandasamy Raja&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-state-of-css-centering-in-2026/&quot;&gt;The State of CSS Centering in 2026&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://devblogs.microsoft.com/visualstudio/plan-before-you-build-introducing-the-plan-agent-in-visual-studio/&quot;&gt;Plan Before You Build: Introducing the Plan agent in Visual Studio&lt;/a&gt;&lt;br /&gt;
Jonatas Siqueira&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/windows-insider/2026/05/15/improving-windows-quality-making-taskbar-and-start-more-personal/&quot;&gt;Improving Windows quality: Making Taskbar and Start more personal&lt;/a&gt;&lt;br /&gt;
Diego Baca&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/real-time-weather-dashboard-maui-tab-view&quot;&gt;Build a Real-Time Weather Dashboard with .NET MAUI 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/installing-basics-telerik-ui-net-maui-ai-coding-assistant&quot;&gt;Installing and Basics of Telerik UI for .NET MAUI AI Coding Assistant&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&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/05/invaders-must-die-cheating-space.html&quot;&gt;Un informático en el lado del mal: Invaders Must Die!: &quot;Cheating&quot; Space Invaders con Inteligencia Artificial para ganar en mi Spectrum&lt;/a&gt;&lt;br /&gt;
Igor Lukic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/stack-overflow-when-we-stop-asking/&quot;&gt;Stack Overflow: When We Stop Asking&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2026/05/four-levels-customer-understanding/&quot;&gt;Four Levels Of Customer Understanding&lt;/a&gt;&lt;br /&gt;
Vitaly Friedman&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/5449924744766004764/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/5449924744766004764' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/5449924744766004764'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/5449924744766004764'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/05/enlaces-interesantes-649.html' title='Enlaces interesantes 649'/><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/AVvXsEg3oYonELPBTnW8YGsoyzMH1GX-nQnQG5OwgEbMJZMAugM_lzdImFn71QRfoG1V0iR_pi_wpdxEpp9TlTB7gPYsy3q3iSDN0QVxsuPuqGzn0Ex23Vy5W0NlzLEtQlSvgxdzLWNxp1RG50jLfmTdKhiIuwhJig8FqOkgMz8g-KMrNF5SCau872NdpA/s72-c/anchor-positioning.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-6859155207891338708</id><published>2026-05-18T08:01:00.000+02:00</published><updated>2026-05-18T08:01:00.118+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 648</title><content type='html'>&lt;img alt=&quot;Desarrolladora con muchos monitores en los que aparecen distintas novedades de la semana&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; lazy=&quot;&quot; loading=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_XrcGXzHgornk1SgQdIHjUV2QPfebXNeBCdruMcHabZWNccwvYTNvt_n9joJgtex-hXL1PKqHuIYN-RwtfabuLYcHAit0quX5lGO-tSR68VvwN3741BE8ROp12rEFgRwUu08zLUmSojC7JhgxAM44rTqgcF4isEnXSs6FxzFb3WSNUYakRGxEHQ/s800/enlaces-648.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Esta semana se ha lanzado la &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-4/&quot; target=&quot;_blank&quot;&gt;preview 4 de .NET 11&lt;/a&gt;, con novedades en el runtime, librerías, SDK, C#, ASP.NET Core, .NET MAUI y Entity Framework Core. Especialmente interesantes la compilación de librerías con el nuevo runtime asíncrono y las incorporaciones a la API Process.&lt;/p&gt;
&lt;p&gt;Se ha anunciado que &lt;a href=&quot;https://github.blog/changelog/2026-05-14-github-copilot-app-is-now-available-in-technical-preview/&quot; target=&quot;_blank&quot;&gt;la aplicación de escritorio GitHub Copilot&lt;/a&gt;, la visión de Microsoft de lo que será el desarrollo agéntico, está ya disponible como &lt;em&gt;technical preview&lt;/em&gt;. Si eres suscriptor de GitHub Copilot Pro o Pro+, puedes comenzar a probarla.&lt;/p&gt;
&lt;p&gt;Milan Jovanović ha publicado un artículo muy interesante sobre &lt;a href=&quot;https://www.milanjovanovic.tech/blog/api-versioning-should-be-your-last-resort&quot; target=&quot;_blank&quot;&gt;el versionado de APIs&lt;/a&gt;, un tema que siempre genera debate y que él aborda desde una perspectiva muy práctica.&lt;/p&gt;
&lt;p&gt;David Ortinau anuncia que el &lt;em&gt;runtime&lt;/em&gt; de &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-maui-moves-to-coreclr-in-dotnet-11/&quot; target=&quot;_blank&quot;&gt;.NET MAUI abandona Mono y se moverá a CoreCLR&lt;/a&gt; en la próxima versión 11, lo que supone un gran paso adelante para esta plataforma, con mejoras en rendimiento, compatibilidad y experiencia de desarrollo.&lt;/p&gt;
&lt;p&gt;Los futuros ordenadores cuánticos podrán romper sin demasiado esfuerzo los sistemas de cifrado actuales, lo que hace que la criptografía post-cuántica sea un tema cada vez más importante. Khalid Abuhakmeh ha publicado una &lt;a href=&quot;https://duendesoftware.com/blog/20260514-post-quantum-cryptography-in-dotnet-10&quot; target=&quot;_blank&quot;&gt;guía práctica para implementarla en .NET 10&lt;/a&gt;, con ejemplos de algoritmos y librerías disponibles.&lt;/p&gt;
&lt;p&gt;Por último, David Fowler ha publicado un artículo muy interesante sobre &lt;a href=&quot;https://www.linkedin.com/pulse/ai-made-us-faster-problem-david-fowler-mgnzc/&quot; target=&quot;_blank&quot;&gt;cómo la IA nos ha hecho más rápidos, pero también creó nuevos cuellos de botella&lt;/a&gt; que obligan a cambiar procesos y hábitos.&lt;/p&gt;
&lt;p&gt;Muchos más enlaces a contenidos interesantes de esta semana, 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/03/javascriptizando-c-chequeo-de-nulos.html&quot;&gt;JavaScriptizando C#: chequeo de nulos usando conversores implícitos&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/06/etiquetado-de-consultas-en-entity.html&quot;&gt;Etiquetado de consultas 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://devblogs.microsoft.com/dotnet/dotnet-11-preview-4/&quot;&gt;.NET 11 Preview 4 is now available!&lt;/a&gt;&lt;br /&gt;
.NET Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/process-api-improvements-in-dotnet-11/&quot;&gt;Process API Improvements in .NET 11&lt;/a&gt;&lt;br /&gt;
Adam Sitnik&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/00fcb870-6bf7-4f97-824f-8eab1b8838be&quot;&gt;BackgroundService exceptions now propagate in .NET 11&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/05/08/linq-filtering-in-c-where-any-all-contains-and-oftype&quot;&gt;LINQ Filtering in C#: Where, Any, All, Contains, and OfType&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.devleader.ca/2026/05/12/linq-aggregation-in-c-count-sum-min-max-average-and-aggregate&quot;&gt;LINQ Aggregation in C#: Count, Sum, Min, Max, Average, and Aggregate&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260512-the-field-keyword-in-csharp-14&quot;&gt;The field Keyword in C# 14: Write Less, Validate More&lt;/a&gt;&lt;br /&gt;
Khalid Abuhakmeh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://benbowen.blog/post/inspecting_3d_objects/&quot;&gt;Inspecting 3D objects (incl. gltf) with a 28-line C# script • Ben Bowen&#39;s Blog&lt;/a&gt;&lt;br /&gt;
Ben Bowen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/stop-pretending-timeprovider-doesnt-exist/&quot;&gt;Stop Pretending TimeProvider Doesn&#39;t Exist&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260514-post-quantum-cryptography-in-dotnet-10&quot;&gt;Post-Quantum Cryptography in .NET 10: A Practical Guide&lt;/a&gt;&lt;br /&gt;
Khalid Abuhakmeh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pmichaels.net/mcp-server-dotnet/&quot;&gt;Creating a Simple MCP Server in .NET&lt;/a&gt;&lt;br /&gt;
Paul Michaels&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/vikrant_bagal_afae3e25ca7/10-net-open-source-libraries-every-developer-should-know-in-2026-1g2h&quot;&gt;10 .NET Open Source Libraries Every Developer Should Know in 2026&lt;/a&gt;&lt;br /&gt;
Vikrant Bagal&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/refactoring-asp-net-core-api-clean-architecture&quot;&gt;Refactoring an ASP.NET Core API with clean architecture&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/articles/asp-net-core-side-car/&quot;&gt;Implementing the Sidecar Pattern in Microservices-Based ASP.NET Core Applications&lt;/a&gt;&lt;br /&gt;
Joydip Kanjilal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/propagating-opentelemetry-context-in-dotnet.htm&quot;&gt;Propagating OpenTelemetry context in .NET&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/exploring-the-dotnet-11-preview-1-running-background-tasks-in-blazor-with-web-workers/&quot;&gt;Running background tasks in Blazor with Web Workers&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/May/13/Getting-the-Client-IP-Address-in-ASPNET-Core&quot;&gt;Getting the Client IP Address in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Rick Strahl&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/05/11/fixing-a-blazor-app-with-vs-codess-new-agent-browser-sharing.aspx&quot;&gt;Fixing a Blazor App with VS Code&#39;s New Agent Browser Sharing&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/streaming-server-events-sse-blazor&quot;&gt;Streaming Server Events with SSE and Blazor&lt;/a&gt;&lt;br /&gt;
Héctor Pérez&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://developmentwithadot.blogspot.com/2026/05/using-aws-locally-with-ministack-and-net.html&quot;&gt;Using AWS Locally with MiniStack and .NET&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/appsonazureblog/introducing-azure-container-apps-express/4519150&quot;&gt;Introducing Azure Container Apps Express!&lt;/a&gt;&lt;br /&gt;
Simon J.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/azure-sdk/exponential-backoff-circuit-breaker-azure-functions/&quot;&gt;Exponential backoff and circuit breaker for Service Bus-triggered Azure Functions&lt;/a&gt;&lt;br /&gt;
Swapnil Nagar&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://martinfowler.com/articles/what-is-code.html&quot;&gt;What Is Code?&lt;/a&gt;&lt;br /&gt;
Unmesh Joshi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/08/csharp-inheritance-vs-composition-when-to-use-each&quot;&gt;C#: Inheritance vs Composition — When to Use Each and Why AI Can&#39;t Decide for You&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mlu-explain.github.io/decision-tree/&quot;&gt;Decision Trees: The unreasonable power of nested decision rules&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://www.milanjovanovic.tech/blog/api-versioning-should-be-your-last-resort&quot;&gt;API Versioning Should Be Your Last Resort&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/debugging-event-driven-systems-5-problems-teams-create/&quot;&gt;Debugging Event-Driven Systems: 5 Problems Teams Create&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&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-la-explosion-cartesiana-hiciste-todo-bien-y-aun-asi-el-query-es-un-desastre-22do&quot;&gt;EF Core: La explosión cartesiana — Hiciste todo bien y aun así el query es un desastre&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/the-complete-guide-to-mastering-dapper-micro-orm-in-net/&quot;&gt;The complete guide to mastering Dapper micro-ORM in .NET&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/agent-skills-vs-custom-instructions-en-codigo-ia-cuando-usar-cada-una.aspx&quot;&gt;Agent Skills vs Custom Instructions en código IA: cuándo usar cada una&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/ai-made-us-faster-problem-david-fowler-mgnzc/&quot;&gt;AI Made Us Faster. That Was the Problem&lt;/a&gt;&lt;br /&gt;
David Fowler&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.uno/blog/composition-stack-for-ai-assisted-net-development/&quot;&gt;Composition Stack for AI-Assisted .NET Development&lt;/a&gt;&lt;br /&gt;
Matt Mattei&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/why-keyboard-users-cant-scroll-your-overflow-containers/&quot;&gt;Why Keyboard Users Can&#39;t Scroll Your Overflow Containers&lt;/a&gt;&lt;br /&gt;
Godstime Aburu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/computing-and-displaying-discounted-prices-in-css/&quot;&gt;Computing and Displaying Discounted Prices in CSS&lt;/a&gt;&lt;br /&gt;
Preethi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/soon-we-can-finally-banish-javascript-to-the-shadowrealm/&quot;&gt;Soon We Can Finally Banish JavaScript to the ShadowRealm&lt;/a&gt;&lt;br /&gt;
Mat Marquis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/callout-ui-with-css-offset-border/&quot;&gt;Callout UI with CSS Offset &amp;amp; Border&lt;/a&gt;&lt;br /&gt;
Preethi Sam&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/repeating-square-dots-backgrounds-in-css/&quot;&gt;Repeating Square Dots Backgrounds in CSS&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/install-element-ot&quot;&gt;Install web apps with the new HTML install element&lt;/a&gt;&lt;br /&gt;
Patrick Bosset&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-11/&quot;&gt;What’s !important&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/how-to-control-infinite-css-animations-part-2-of-2/&quot;&gt;How to Control Infinite CSS Animations (Part 2 of 2)&lt;/a&gt;&lt;br /&gt;
Temani Afif&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start&quot;&gt;How Claude Code works in large codebases: Best practices and where to start&lt;/a&gt;&lt;br /&gt;
Claude 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://github.blog/news-insights/company-news/github-copilot-individual-plans-introducing-flex-allotments-in-pro-and-pro-and-a-new-max-plan/&quot;&gt;GitHub Copilot individual plans: Introducing flex allotments in Pro and Pro+, and a new Max plan&lt;/a&gt;&lt;br /&gt;
Joe Binder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/changelog/2026-05-14-github-copilot-app-is-now-available-in-technical-preview/&quot;&gt;GitHub Copilot app is now available in technical preview&lt;/a&gt;&lt;br /&gt;
GitHub&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jetbrains.com/dotnet/2026/05/11/the-resharper-2026-2-eap-any-ai-agent-in-visual-studio/&quot;&gt;The ReSharper 2026.2 Early Access Program Begins: Bringing More AI Agents into Visual Studio&lt;/a&gt;&lt;br /&gt;
Rachel Appel&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/dotnet-maui-moves-to-coreclr-in-dotnet-11/&quot;&gt;.NET MAUI Moves to CoreCLR in .NET 11&lt;/a&gt;&lt;br /&gt;
David Ortinau&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/ai-assisted-rich-text-editor-dotnet-maui&quot;&gt;Build an AI-Powered&amp;nbsp;Rich Text Editor&amp;nbsp;in&amp;nbsp;.NET MAUI with&amp;nbsp;AI&amp;nbsp;AssistView&lt;/a&gt;&lt;br /&gt;
Tamilarasan Gunasekaran&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/how-to-verify-network-connectivity-net-maui&quot;&gt;How to Verify Network Connectivity 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://jmalarcon.es/posts/nuevo-ludismo-monet&quot;&gt;Un cuadro de Monet y el nuevo ludismo&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260512-00/?p=112316&quot;&gt;Why do Windows client editions on 32-bit x86 systems artificially limit RAM to 4 GB?&lt;/a&gt;&lt;br /&gt;
Raymond Chen&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/6859155207891338708/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/6859155207891338708' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6859155207891338708'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6859155207891338708'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/05/enlaces-interesantes-648.html' title='Enlaces interesantes 648'/><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/AVvXsEh_XrcGXzHgornk1SgQdIHjUV2QPfebXNeBCdruMcHabZWNccwvYTNvt_n9joJgtex-hXL1PKqHuIYN-RwtfabuLYcHAit0quX5lGO-tSR68VvwN3741BE8ROp12rEFgRwUu08zLUmSojC7JhgxAM44rTqgcF4isEnXSs6FxzFb3WSNUYakRGxEHQ/s72-c/enlaces-648.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-2730744101145625569</id><published>2026-05-12T08:01:00.076+02:00</published><updated>2026-05-17T11:59:58.602+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aniversario"/><category scheme="http://www.blogger.com/atom/ns#" term="blogging"/><title type='text'>¡Variable not found cumple 20 años! ¿Y ahora, qué?</title><content type='html'>&lt;img alt=&quot;Yo mismo, escribiendo este post&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEEDeRf5ZoRRIBw7lHSJWKKCDT8YqsZe6A1O4YuG8SZcyyOrmOqcANhl5FuFpszfSlGnXJFx41TqLR6Cua-vyXqDnh27g8ysGcw6sgCJ9rGHaZb9VQm-RXpuc07D-owxxeb02WffYV6F1q-Q7kJU0lR1rb7rfMtdYhy8xCzgXjWKz-0WbwMQw2Dw/s800/20years.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;En 2006 estábamos en pleno apogeo de los blogs personales de contenido técnico. La comunidad de desarrolladores estaba creciendo a pasos agigantados, y los blogs eran una de las formas más populares de compartir conocimientos, experiencias y descubrimientos. Yo era un gran consumidor de estos contenidos y seguía fielmente a autores que, aún hoy, son referentes para mí en muchos aspectos.&lt;/p&gt;
&lt;p&gt;Y aunque no sabía muy bien a dónde iba, el 8 de mayo decidí subirme a ese tren con la ilusión de aportar mi pequeño granito de arena a la comunidad y devolverle al menos una pequeña parte de lo que tanto me había dado a lo largo de los años.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Han pasado veinte años&lt;/b&gt; desde que escribí &lt;a href=&quot;https://www.variablenotfound.com/2006/05/paren-el-tren-que-me-subo.html&quot; target=&quot;_blank&quot;&gt;el primer post en Variable Not Found&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En este tiempo he publicado más de 1.600 entradas en las que he compartido mis conocimientos, experiencias y descubrimientos sobre desarrollo web, centrado sobre todo, aunque no exclusivamente, en el ecosistema de Microsoft. Los más de seis millones de visualizaciones que han tenido mis posts a lo largo de los años me han dado la oportunidad de alcanzar una audiencia global y conectar con personas de todo el mundo que comparten mi pasión por la tecnología, y llegar profesionalmente a lugares que nunca imaginé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Muchas gracias a todos los que me habéis acompañado en este viaje&lt;/strong&gt;, habéis leído mis posts, dejado comentarios, compartido mis contenidos y, en general, apoyado mi trabajo de alguna manera. Sin vosotros, nada de esto habría sido posible.&lt;/p&gt;
&lt;p&gt;Pero como de costumbre, me gusta aprovechar estas fechas para mirar con frialdad y reflexionar sobre cómo vamos evolucionando y a dónde nos dirigimos. Porque, al igual que el año pasado,&lt;b&gt; la cosa sigue pintando muy mal&lt;/b&gt;: el número de visitas sigue cayendo en picado, y la mayoría de los lectores que quedan por aquí son robots obteniendo el contenido publicado 😢&lt;/p&gt;
&lt;p&gt;¿Vale la pena seguir adelante? Pues no lo tengo nada claro...&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;¿Es el fin de los blogs técnicos?&lt;/h2&gt;
&lt;p&gt;Realmente, si mirara hacia fuera y viera que el resto de blogs técnicos siguen existiendo y manteniendo su audiencia, podría pensar que el problema es mío: quizás mis contenidos ya no son interesantes para la comunidad, quizás no estoy haciendo un buen trabajo promocionándolos, o quién sabe.&lt;/p&gt;
&lt;p&gt;Pero la realidad es que &lt;strong&gt;el descalabro de los blogs técnicos es generalizado&lt;/strong&gt;. Solo hay que ver que muchos de los sitios que antes eran referentes en la comunidad han cerrado o han dejado de publicar con una regularidad razonable. Cada vez es más difícil encontrar contenido de calidad y actualizado con frecuencia.&lt;/p&gt;
&lt;p&gt;Esto podría deberse a varios factores, como el auge de las redes sociales y canales alternativos (vídeos, podcasts, streaming...), la saturación de contenido en internet o la falta de tiempo y motivación para mantener un blog. Pero, sobre todo, creo que &lt;strong&gt;la dramática caída en el número de visitantes está consiguiendo que el esfuerzo de mantener un blog no merezca la pena&lt;/strong&gt;. Al fin y al cabo, esto tiene sentido si hay alguien al otro lado, ¿no?&lt;/p&gt;
&lt;p&gt;El factor que más está contribuyendo al vertiginoso descenso de las visitas a mi blog es la dramática caída en el uso de buscadores, algo de lo que dependía el tráfico de la mayoría de sitios de contenido técnico especializado. En mi caso, más del 80% del tráfico de Variable Not Found procedía de búsquedas orgánicas, así que es lógico que este batacazo salpique directamente a las métricas. A día de hoy, &lt;strong&gt;solo un 16% de los visitantes llega a través de buscadores&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pero analizando las estadísticas de visitantes del blog, hay más datos que encienden las alarmas. En el último año, las páginas vistas han caído un 21%, aunque curiosamente el número de usuarios distintos ha subido un 58%:&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Periodo&lt;/th&gt;
&lt;th&gt;Usuarios distintos&lt;/th&gt;
&lt;th&gt;Páginas vistas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2022-2023&lt;/td&gt;
&lt;td&gt;90.000 (-16%)&lt;/td&gt;
&lt;td&gt;150.000 (-17%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023-2024&lt;/td&gt;
&lt;td&gt;62.000 (-31%)&lt;/td&gt;
&lt;td&gt;121.000 (-19%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-2025&lt;/td&gt;
&lt;td&gt;29.000 (-53%)&lt;/td&gt;
&lt;td&gt;80.000 (-34%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-2026&lt;/td&gt;
&lt;td&gt;46.000 (+58%)&lt;/td&gt;
&lt;td&gt;64.000 (-21%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Es decir, hay más visitantes, pero menos comprometidos con el sitio y sus contenidos. ¿Extraño, verdad?&lt;/p&gt;
&lt;p&gt;Se puede explicar si echamos un vistazo al origen de los visitantes. Sospechosamente, más del 70% de los visitantes proceden de países como China o Singapur, algo raro teniendo en cuenta que mis contenidos no son precisamente los más amigables para esa audiencia. El año pasado, este porcentaje era solo del 3%, lo que indica que algo ha cambiado radicalmente en el último año.&lt;/p&gt;
&lt;p&gt;Pero, además, sumémosle que el tráfico directo (es decir, que no viene de búsquedas, ni redes sociales ni enlaces externos) también sobrepasa el 70% del total, mientras que el año pasado era del 18%. Es decir, que la mayoría de los visitantes han comenzado a llegar a mi sitio sin pasar por ningún intermediario, lo que es muy raro teniendo en cuenta que no tengo una marca personal especialmente fuerte, ni una comunidad muy activa, ni los hábitos de consumo actuales incluyen visitar directamente los sitios web.&lt;/p&gt;
&lt;p&gt;La conclusión es clara: &lt;strong&gt;gran parte del tráfico de Variable Not Found procede de &lt;em&gt;bots,&lt;/em&gt;&amp;nbsp;&lt;em&gt;crawlers, scrapers&lt;/em&gt;&lt;/strong&gt;, y otros bichillos de la fauna digital, probablemente alimentando modelos de IA con esta información. Modelos que más adelante podrán responder a sus usuarios usando esta información, pero que no aportan ningún valor a mi sitio ni a mi trabajo.&lt;/p&gt;
&lt;p&gt;Porque lo que es indudable, y además imparable, es que los desarrolladores utilizamos casi exclusivamente la IA para resolver nuestras dudas. &lt;strong&gt;La era de buscar en Google y leer un post para resolver un problema concreto se ha acabado&lt;/strong&gt;. Además, esto también se aprecia viendo el declive de otras comunidades de preguntas y respuestas como StackOverflow, CodeProject o Foros del Web, que han visto caer su tráfico de forma dramática en los últimos años.&lt;/p&gt;
&lt;p&gt;No sé si otros blogs técnicos estarán observando esta misma tendencia en sus estadísticas, pero me temo que será así, puntos porcentuales arriba o abajo. Y en este caso, &lt;strong&gt;el futuro de los blogs técnicos no pinta nada bien&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Y hay otro detalle que también me preocupa: siempre he dicho que una de las principales utilidades de mi blog era la de servir como un cuaderno de notas donde apuntar lo que iba aprendiendo, y, de paso, que otros pudieran aprovecharlo. Yo era mi principal usuario, y visitaba mi blog con frecuencia para consultar mis propias anotaciones. Pero cuando veo que la mayoría de las veces &lt;strong&gt;incluso yo mismo no acudo a mi blog a consultar las dudas&lt;/strong&gt; porque es más cómodo preguntárselo a mi modelo favorito, creo que algo no va bien.&lt;/p&gt;
&lt;p&gt;No es demasiado motivador, ¿verdad?&lt;/p&gt;
&lt;h2&gt;¿Tiene sentido seguir adelante con Variable Not Found?&lt;/h2&gt;
&lt;p&gt;Pues no lo tengo nada claro, la verdad. Ya en el análisis del año pasado comentaba que el futuro no pintaba nada bien, y que &lt;strong&gt;temía que el blog quedara como pienso para alimentar las IAs, y parece que no me equivocaba demasiado&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sigo disfrutando mucho escribiendo, principalmente porque me obliga a estudiar y aprender en profundidad sobre los temas que me interesan y porque pienso que a alguien le ayudará, pero si realmente no hay nadie al otro lado, ¿tiene sentido seguir invirtiendo tiempo y esfuerzo en ello? ¿No podría simplemente tomar notas para mi consumo personal y dedicar el tiempo que requiere gestionar el blog (que no es poco) a aprender otras cosas que me interesan?&lt;/p&gt;&lt;p&gt;En cualquier caso, dejarlo no sería una decisión sencilla. Variable Not Found forma parte de mi vida desde hace veinte años, y uno no puede desprenderse de algo así de un día para otro. Eso sí, cuando tenga que hacerlo, pasaré página orgulloso de haber llegado hasta aquí y con la satisfacción de haber intentado devolver a la comunidad una mínima parte de lo que ella me ha dado.&lt;/p&gt;&lt;p&gt;En fin, seamos positivos: de momento seguiré escribiendo como siempre, aunque, sinceramente, no sé por cuánto tiempo más. Que digo yo que alguien tendrá que dar de comer a las IAs, ¿no? 😁&lt;/p&gt;
&lt;p&gt;Nuevamente, &lt;b&gt;muchas gracias a todos por estar ahí&lt;/b&gt;. Vayamos a donde vayamos, siempre os agradeceré el apoyo que me habéis brindado a lo largo de estos veinte años.&lt;/p&gt;&lt;p&gt;¡Seguimos viéndonos por aquí!&lt;/p&gt;&lt;div&gt;Publicado en: &lt;a href=&quot;https://www.variablenotfound.com&quot;&gt;www.variablenotfound.com&lt;/a&gt;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.variablenotfound.com/feeds/2730744101145625569/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/2730744101145625569' title='33 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2730744101145625569'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/2730744101145625569'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/05/variable-not-found-cumple-20-anos-y.html' title='¡Variable not found cumple 20 años! ¿Y ahora, qué?'/><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/AVvXsEiEEDeRf5ZoRRIBw7lHSJWKKCDT8YqsZe6A1O4YuG8SZcyyOrmOqcANhl5FuFpszfSlGnXJFx41TqLR6Cua-vyXqDnh27g8ysGcw6sgCJ9rGHaZb9VQm-RXpuc07D-owxxeb02WffYV6F1q-Q7kJU0lR1rb7rfMtdYhy8xCzgXjWKz-0WbwMQw2Dw/s72-c/20years.jpg" height="72" width="72"/><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-7317718708638150045</id><published>2026-05-11T08:01:00.001+02:00</published><updated>2026-05-11T08:01:00.113+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 647</title><content type='html'>&lt;img alt=&quot;Desarrollador pensando si crear su nuevo tipo usando class, record, struct o interface&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5L4FFizeW_EaUzdV2yiwEvEgBOsiN428SSig8nuLUYYzpI7zspmp9vO1b8TSyO3jNovmPoVzhoRX1Yb2kqyz-9II7Ii4oIex6yFpnU8boCXty4VRQ5MV4uETtEfc2QvQIVqTwl6SRfyhE8UQ2m7ILS6lw8r_N_GiNSn2r_LzJF5FAec4u9NZOog/s800/newtypeoptions.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;Tras un mini parón por vacaciones, vuelvo a la carga con los enlaces interesantes, esta vez recopilados durante las dos últimas semanas, por lo es especialmente abundante. Cerca de 90 referencias a los que creo que vale la pena echar el vistazo para estar al día de lo que se cuece en .NET, ASP.NET Core, IA, Javascript, CSS y muchos otros temas relacionados con el desarrollo de software.&lt;/p&gt;
&lt;p&gt;Por destacar algunos, encontramos a Isaac Ojeda hablando de &lt;a href=&quot;https://dev.to/isaacojeda/ef-core-n1-una-query-en-dev-mil-queries-en-produccion-2kg4&quot; target=&quot;_blank&quot;&gt;cómo evitar el temido problema N+1&lt;/a&gt; en Entity Framework Core, todo un clásico que merece ser recordado de vez en cuando-&lt;/p&gt;
&lt;p&gt;Y otro clásico: cuando queremos crear un nuevo tipo en C#, &lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/07/csharp-class-record-struct-or-interface-how-to-choose&quot; target=&quot;_blank&quot;&gt;¿debería ser una clase, un record, una struct o una interfaz?&lt;/a&gt; Chris Pietschmann nos da su opinión al respecto, y una guía práctica para elegir la mejor opción en cada caso.&lt;/p&gt;
&lt;p&gt;Martin Stühmer nos advierte sobre &lt;a href=&quot;https://daily-devops.net/posts/dotnet-source-generators-hidden-costs/&quot; target=&quot;_blank&quot;&gt;los costes ocultos de los Source Generators en .NET&lt;/a&gt;, una tecnología muy potente pero que puede afectar al rendimiento de la compilación si no se usa con cuidado.&lt;/p&gt;
&lt;p&gt;Mario Rodriguez nos cuenta uno de los cambios que más pueden impactar en equipos y empresas este año: &lt;a href=&quot;https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/&quot; target=&quot;_blank&quot;&gt;GitHub Copilot pasa a un modelo de facturación por uso&lt;/a&gt;. Si trabajas con esta IA a diario, este enlace es casi de lectura obligatoria.&lt;/p&gt;
&lt;p&gt;Khalid Abuhakmeh pone el foco en un problema tan común como traicionero en producción: &lt;a href=&quot;https://duendesoftware.com/blog/20260429-aspnet-core-cookie-size-limits&quot; target=&quot;_blank&quot;&gt;los límites de tamaño de cookies en ASP.NET Core&lt;/a&gt;, con causas y soluciones prácticas para evitar sustos en aspectos como autenticación y sesiones.&lt;/p&gt;
&lt;p&gt;Oren Eini &lt;a href=&quot;https://ayende.com/blog/203975-a/learning-to-code-1990s-vs-2026/&quot; target=&quot;_blank&quot;&gt;contrasta cómo se aprendía a programar en los 90 con la forma de hacerlo en la actualidad&lt;/a&gt;, y cómo la IA está transformando —y a veces debilitando— la comprensión profunda que necesitan los desarrolladores de hoy.&lt;/p&gt;
&lt;p&gt;Esto y mucho más, 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/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;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/06/indices-y-rangos-en-c-8-2-de-2.html&quot;&gt;Índices y rangos en C# 8 (2 de 2)&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.campusmvp.es/recursos/post/microsoft-winapp-cli-la-herramienta-que-unifica-el-desarrollo-para-windows.aspx&quot;&gt;Microsoft WinApp CLI: la herramienta que unifica el desarrollo para Windows&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/isaacojeda/como-manejar-fallos-transitorios-en-net-con-polly-y-resiliencepipelinebuilder-4fk4&quot;&gt;Cómo manejar fallos transitorios en .NET con Polly y ResiliencePipelineBuilder&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/ifdef-windows/announcing-the-winapp-vs-code-extension-run-debug-and-package-windows-apps-in-vs-code/&quot;&gt;Announcing the WinApp VS Code Extension — Run, Debug, and Package Windows Apps in VS Code -&lt;/a&gt;&lt;br /&gt;
Chiara Mooney&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/best-way-create-email-templates&quot;&gt;The best way to create email templates in .NET&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://steven-giesel.com/blogPost/18a61100-6074-43ac-86ae-573ad66a2c8a&quot;&gt;ConfigurationIgnoreAttribute in .NET 11&lt;/a&gt;&lt;br /&gt;
Steven Giesel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/24/c-regex-complete-guide-to-regular-expressions-in-net&quot;&gt;C# Regex: Complete Guide to Regular Expressions in .NET&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/04/docker-support-for-isolator.html&quot;&gt;Docker Support for Isolator&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/high-performance-distributed-caching-dotnet-postgres-azure/&quot;&gt;High-Performance Distributed Caching with .NET and Postgres on Azure&lt;/a&gt;&lt;br /&gt;
Matthew Schwartz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/welcome-to-skia-sharp-40-preview1/&quot;&gt;Welcome to SkiaSharp 4.0 Preview 1&lt;/a&gt;&lt;br /&gt;
David Ortinau&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/vs-test-is-removing-its-newtonsoft-json-dependency/&quot;&gt;VSTest is Removing its Newtonsoft.Json Dependency&lt;/a&gt;&lt;br /&gt;
McKenna Barlow&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/privacy-audit-automation-dotnet-cli/&quot;&gt;Your Privacy Docs Are Fiction: Let&#39;s Fix That with .NET CLI Tools&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260430-harden-your-dotnet-json-deserialization&quot;&gt;Harden Your .NET JSON Deserialization with System.Text.Json and JsonSerializerOptions.Strict&lt;/a&gt;&lt;br /&gt;
Khalid Abuhakmeh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reflectionit.nl/blog/2026/intro-disposegenerator&quot;&gt;Introducing ReflectionIT.DisposeGenerator — A Modern Source Generator for the Dispose Pattern&lt;/a&gt;&lt;br /&gt;
Fons Sonnemans&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/04/29/csharp-dotnet-performance-what-to-optimize-first&quot;&gt;C# / .NET Performance: Why Is It Slow &#39;Here&#39; and What Should You Optimize First?&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/multi-layer-caching-with-the-decorator-pattern&quot;&gt;Multi-layer Caching with the Decorator Pattern&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/pattern-matching-in-c-advanced-scenarios-you-didnt-know/&quot;&gt;Pattern matching in C#: Advanced scenarios you didn&#39;t know&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/dotnet-source-generators-hidden-costs/&quot;&gt;Source Generators: The Build Performance Killer Nobody Warned You About&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developmentwithadot.blogspot.com/2026/05/c-records.html&quot;&gt;C# Records&lt;/a&gt;&lt;br /&gt;
Ricardo Peres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/05/07/linq-in-c-complete-guide-to-language-integrated-query-net-69&quot;&gt;LINQ in C#: Complete Guide to Language Integrated Query (.NET 6-9)&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/07/csharp-class-record-struct-or-interface-how-to-choose&quot;&gt;C#: Should This Be a Class, Record, Struct, or Interface?&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&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.pietschsoft.com/post/2026/04/25/aspnet-core-how-to-structure-a-growing-application-so-it-stays-maintainable&quot;&gt;ASP.NET: How to Structure a Growing Application So It Stays Maintainable&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/api-versioning-in-dotnet-10-applications/&quot;&gt;Combining API versioning with OpenAPI in .NET 10 applications&lt;/a&gt;&lt;br /&gt;
Sander ten Brinke Author&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duendesoftware.com/blog/20260429-aspnet-core-cookie-size-limits&quot;&gt;ASP.NET Core Cookie Size Limits in Production: Causes and Fixes&lt;/a&gt;&lt;br /&gt;
Khalid Abuhakmeh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazingcode.dev/articles/blazingmvvm-production-mvvm-for-every-blazor-hosting-model&quot;&gt;Blazing.Mvvm - Production MVVM for Every Blazor Hosting Model&lt;/a&gt;&lt;br /&gt;
Graeme Grant&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/how-to-migrate-controllers-to-minimal-apis&quot;&gt;How to migrate from controllers to Minimal APIs&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pietschsoft.com/post/2026/05/01/csharp-dotnet-cleanest-way-to-add-cross-cutting-concerns&quot;&gt;The Cleanest Way to Introduce a New Cross-Cutting Concern&lt;/a&gt;&lt;br /&gt;
Chris Pietschmann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/disable-http-caching-by-default-in-asp-net-core-apis.htm&quot;&gt;Disable HTTP caching by default in ASP.NET Core APIs&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blazorhelpwebsite.com/ViewBlogPost/20085&quot;&gt;SimpleChat: A Provider-Agnostic AI Chat Starter for Blazor&lt;/a&gt;&lt;br /&gt;
Michael Washington&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/copilot-studio-dotnet-10-migration/&quot;&gt;Copilot Studio gets faster with .NET 10 on WebAssembly&lt;/a&gt;&lt;br /&gt;
Daniel Roth&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://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/&quot;&gt;SQL MCP Server as an App Service&lt;/a&gt;&lt;br /&gt;
Mathew Kishe&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azuregovernanceandmanagementblog/introducing-the-azure-resource-manager-mcp-server/4517521&quot;&gt;Introducing the Azure Resource Manager MCP Server!&lt;/a&gt;&lt;br /&gt;
Steven Bucher&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://dev.to/isaacojeda/ports-adapters-como-aislar-tu-nucleo-de-todo-lo-que-puede-cambiar-51jl&quot;&gt;Ports &amp;amp; Adapters: cómo aislar tu núcleo de todo lo que puede cambiar&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/just-use-postgres-as-a-queue/&quot;&gt;Just Use Postgres as a Queue?&lt;/a&gt;&lt;br /&gt;
Derek Comartin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/cli-security-testing-audit/&quot;&gt;Security Tests That Prove Themselves&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/05/01/bridge-design-pattern-in-c-complete-guide-with-examples&quot;&gt;Bridge 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://adrianbailador.github.io/blog/57-cqrs-without-mediatr-dotnet/&quot;&gt;CQRS Without MediatR: Hand-Rolled Command and Query Handlers in .NET | Adrian Bailador&lt;/a&gt;&lt;br /&gt;
Adrian Bailador&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-n1-una-query-en-dev-mil-queries-en-produccion-2kg4&quot;&gt;EF Core: N+1 — Una query en dev, mil queries en producción&lt;/a&gt;&lt;br /&gt;
Isaac Ojeda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/ef-core-performance-tuning-dotnet&quot;&gt;How to Fix Slow EF Core Queries: Practical Performance Tuning&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/azure-cosmos-db-conf-2026-recap-lessons-from-production&quot;&gt;Azure Cosmos DB Conf 2026 Recap: Lessons from Production&lt;/a&gt;&lt;br /&gt;
Mark Brown&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/databases/sql-server/managed-identities-in-sql-server-2025-a-complete-guide/&quot;&gt;What are managed identities in SQL Server 2025? A complete guide&lt;/a&gt;&lt;br /&gt;
Greg Low&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/creating-more-realistic-tests-memory-databases-aspnet-core&quot;&gt;More Realistic Tests with In-Memory Databases ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Assis Zang&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/eliminacion-de-datos-personales-con-ia-el-modelo-open-source-de-openai-que-se-ejecuta-en-local.aspx&quot;&gt;Eliminación de datos personales con IA: el modelo Open Source de OpenAI que se ejecuta en local&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/la-factura-de-ia-por-qu%C3%A9-el-talento-pesa-m%C3%A1s-que-los-david-tgalc/&quot;&gt;La factura de la IA: por qué el talento pesa más que los tokens&lt;/a&gt;&lt;br /&gt;
David Carrero&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/gpt-5-5-instant/&quot;&gt;GPT-5.5 Instant: smarter, clearer, and more personalized&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/&quot;&gt;GitHub Copilot is moving to usage-based billing&lt;/a&gt;&lt;br /&gt;
Mario Rodriguez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.google/innovation-and-ai/technology/developers-tools/multi-token-prediction-gemma-4/&quot;&gt;Multi-token-prediction in Gemma 4&lt;/a&gt;&lt;br /&gt;
Olivier Lacombe &amp;amp; Maarten Grootendorst&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/&quot;&gt;Governing MCP tool calls in .NET with the Agent Governance Toolkit&lt;/a&gt;&lt;br /&gt;
Jack Batzner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/&quot;&gt;Microsoft Agent Framework - Building Blocks for AI Part 3&lt;/a&gt;&lt;br /&gt;
Jeremy Likness&lt;/li&gt;
&lt;li&gt;Running GitHub Copilot CLI Offline with Local Models: &lt;a href=&quot;https://elbruno.com/2026/05/03/running-github-copilot-cli-offline-with-local-models-a-cpu-only-reality-check/&quot;&gt;A CPU-Only Reality Check&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://elbruno.com/2026/05/06/running-github-copilot-cli-offline-with-local-models-gpu-edition/&quot;&gt;GPU Edition&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/ai-assisted-coding-a-practical-guide-for-software-engineers/&quot;&gt;AI-Assisted Coding: A Practical Guide for Software Engineers&lt;/a&gt; &amp;amp; * &lt;a href=&quot;https://frontendmasters.com/blog/ai-amplifies-everything-a-team-leads-guide-to-ai-assisted-development/&quot;&gt;AI Amplifies Everything: A Team Lead’s Guide to AI-Assisted Development&lt;/a&gt;&lt;br /&gt;
Durgesh Rajubhai Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/05/01/quadratic-regression-with-pseudo-inverse-training-using-csharp.aspx&quot;&gt;Quadratic Regression with Pseudo-Inverse Training Using C#&lt;/a&gt;&lt;br /&gt;
James McCaffrey&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/&quot;&gt;Durable Workflows in the Microsoft Agent Framework&lt;/a&gt;&lt;br /&gt;
Shyju Krishnankutty&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/claudeignore-dotnet/&quot;&gt;.claudeignore Doesn&#39;t Exist. Here&#39;s What Does.&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/&quot;&gt;Advancing voice intelligence with new models in the API&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 style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/using-nonexistent-nth-letter-selector-now/&quot;&gt;Let’s Use the Nonexistent ::nth-letter Selector Now&lt;/a&gt;&lt;br /&gt;
Lee Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/build-a-web-based-production-planning-spreadsheet-in-react&quot;&gt;Build a Web-Based Production Planning Spreadsheet in React&lt;/a&gt;&lt;br /&gt;
Sumathi Uthayakumar&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/almanac/functions/c/contrast/&quot;&gt;contrast()&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://css-tricks.com/almanac/functions/c/contrast-color/&quot;&gt;contrast-color()&lt;/a&gt;&lt;br /&gt;
Gabriel Shoyombo&lt;/li&gt;&lt;ul&gt;
&lt;/ul&gt;

&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-10/&quot;&gt;What’s !important#10: HTML-in-Canvas, Hex Maps, E-ink Optimization, and More&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/fixed-height-cards-more-fragile-than-they-look/&quot;&gt;Fixed-Height Cards: More Fragile Than They Look&lt;/a&gt;&lt;br /&gt;
Kevine Nzapdi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/css-n-of-selectors-for-conditional-validation/&quot;&gt;CSS &lt;code&gt;n of&lt;/code&gt; Selectors for Conditional Validation&lt;/a&gt;&lt;br /&gt;
Preethi Sam&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/generative-colors-with-css/&quot;&gt;Generative colors with CSS&lt;/a&gt;&lt;br /&gt;
Chris Ferdinandi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-importance-of-native-randomness-in-css/&quot;&gt;The Importance of Native Randomness in CSS&lt;/a&gt;&lt;br /&gt;
Alvaro Montoro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yuanchuan.dev/multi-stroke-text-effect-in-css&quot;&gt;Multi-stroke text effect in CSS&lt;/a&gt;&lt;br /&gt;
Yuan Chuan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/zigzag-css-grid-layouts/&quot;&gt;Making Zigzag CSS Layouts With a Grid + Transform Trick&lt;/a&gt;&lt;br /&gt;
Durgesh Rajubhai Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://allthingssmitty.com/2026/04/20/why-i-dont-chain-everything-in-javascript-anymore/&quot;&gt;Why I don&#39;t chain everything in JavaScript anymore&lt;/a&gt;&lt;br /&gt;
Matt Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/animating-focus-with-view-transitions/&quot;&gt;Animating Focus with View Transitions&lt;/a&gt;&lt;br /&gt;
Chris Coyier&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/a-scrollytelling-gift-for-mum-on-mothers-day-2026/&quot;&gt;A Scrollytelling Gift for Mum on Mother’s Day 2026&lt;/a&gt;&lt;br /&gt;
Lee Meyer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/using-css-corner-shape-for-folded-corners/&quot;&gt;Using CSS&amp;nbsp;corner-shape&amp;nbsp;For Folded Corners&lt;/a&gt;&lt;br /&gt;
Daniel Schwarz&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/how-to-control-infinite-css-animations-part-1-of-2/&quot;&gt;How to Control Infinite CSS Animations (Part 1 of 2)&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.returngis.net/2026/04/agent-hooks-github-copilot-lint-formato-automatico/&quot;&gt;Control de calidad en Agentic DevOps: automatiza linting y formateo con hooks&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.returngis.net/2026/05/vs-code-tunnels-sin-instalar-vs-code-accede-a-tu-maquina-remota-desde-el-navegador/&quot;&gt;VS Code Tunnels sin instalar VS Code: accede a tu máquina remota desde el navegador&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.woodruff.dev/resharper-made-vs-code-a-real-option-for-my-net-work/&quot;&gt;ReSharper Made VS Code a Real Option for My .NET Work&lt;/a&gt;&lt;br /&gt;
Chris Woodruff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/new-features-in-git-2-54-easier-rebasing-hooks-and-statistcs/&quot;&gt;New features in Git 2.54: easier rebasing, hooks, and statistics&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/&quot;&gt;Visual Studio April Update – Cloud Agent Integration&lt;/a&gt;&lt;br /&gt;
Mark Downie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visualstudiomagazine.com/articles/2026/04/28/visual-studio-2026-gives-intellisense-priority-over-copilot.aspx&quot;&gt;Visual Studio 2026 Gives IntelliSense Priority in Longstanding Copilot Completion Clash&lt;/a&gt;&lt;br /&gt;
David Ramel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/typescript-7-beta-now-enabled-by-default-in-visual-studio-2026-18-6-insiders-3/&quot;&gt;TypeScript 7 Beta Now Enabled by Default in Visual Studio 2026 18.6 Insiders 3&lt;/a&gt;&lt;br /&gt;
Daniel Flöijer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/commandline/the-new-run-dialog-faster-cleaner-and-more-capable/&quot;&gt;The new Run dialog: faster, cleaner, and more capable&lt;/a&gt;&lt;br /&gt;
Clint Rutkas&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/sdk-style-support-for-extension-projects/&quot;&gt;SDK-Style Support for Extension Projects&lt;/a&gt;&lt;br /&gt;
Andrea Viel&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/use-native-device-features-dotnet-maui&quot;&gt;Integrating Native Device Features in .NET MAUI with Built‑In APIs&lt;/a&gt;&lt;br /&gt;
Shalini Suresh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/integrating-haptic-feedback-net-maui&quot;&gt;Integrating Haptic Feedback 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://jmalarcon.es/posts/estrategia-google-inversion-anthropic&quot;&gt;¿Por qué Google financia a su mayor rival? El juego de ajedrez detrás de lo de Anthropic&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ayende.com/blog/203975-a/learning-to-code-1990s-vs-2026/&quot;&gt;Learning to code, 1990s vs 2026&lt;/a&gt;&lt;br /&gt;
Oren Eini&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/7317718708638150045/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/7317718708638150045' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7317718708638150045'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/7317718708638150045'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/05/enlaces-interesantes-647.html' title='Enlaces interesantes 647'/><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/AVvXsEj5L4FFizeW_EaUzdV2yiwEvEgBOsiN428SSig8nuLUYYzpI7zspmp9vO1b8TSyO3jNovmPoVzhoRX1Yb2kqyz-9II7Ii4oIex6yFpnU8boCXty4VRQ5MV4uETtEfc2QvQIVqTwl6SRfyhE8UQ2m7ILS6lw8r_N_GiNSn2r_LzJF5FAec4u9NZOog/s72-c/newtypeoptions.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-6963594273154501947</id><published>2026-04-27T08:01:00.065+02:00</published><updated>2026-04-27T08:01:00.114+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 646</title><content type='html'>&lt;img alt=&quot;Avión moderno llamado TypeScript 7 adelantando a toda velocidad a otro avión más antiguo TypeScript 6&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-01438Vmwm75h3tK28M2m2K-z4C0lovy2WzORRZvL8E7SJ_HT4WZiE_pcY9t1S85yG_-QUkWsk41-nspYC_HIe2avmTNUIzN8gcbFzhFUNZsG6yAC9twVDzmCInZCjFEkTArHnHYcZpKrzCla3Mk1M6OzQ0lfSSfc2ADxj9v9bQ0gxVkgPinCdg/s800/ts7-beta.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Entre los contenidos interesantes de esta semana, se ha anunciado &lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/&quot; target=&quot;_blank&quot;&gt;la beta del esperado TypeScript 7.0&lt;/a&gt; implementado en Go, prometiendo mejoras de rendimiento en compilación de hasta 10 veces respecto a las versiones anteriores. Y según comentan, que la &quot;beta&quot; no engañe: esta versión es ya bastante estable y en muchos escenarios podríamos empezar a usarla ya y disfrutar de sus mejoras, porque además podemos instalarla &quot;side by side&quot; con las versiones actuales.&lt;/p&gt;
&lt;p&gt;Por otro lado, he de decir que los constructores primarios de C# no son mi opción por defecto cuando implemento una clase. Pero bueno, como hay que estar abierto a los cambios, me ha parecido interesante el post de Milan Jovanović donde explica&lt;a href=&quot;https://www.milanjovanovic.tech/blog/why-i-switched-to-primary-constructors-for-di-in-csharp&quot; target=&quot;_blank&quot;&gt; por qué los usa al aplicar Inyección de Dependencias&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;¿La IA es una moda pasajera, o lo cambia todo? Pienses lo que pienses, lo que es seguro es la tenemos encima, y tenemos que saber cómo lidiar con esta nueva situación. José Manuel Alarcón reflexiona sobre &lt;a href=&quot;https://jmalarcon.es/posts/ia-y-trabajo-quien-gana-quien-sobra&quot; target=&quot;_blank&quot;&gt;cómo la inteligencia artificial está transformando el trabajo real&lt;/a&gt;, lejos de los discursos apocalípticos o utópicos, y qué deberíamos hacer al respecto.&lt;/p&gt;&lt;p&gt;Por cierto, si usas un plan individual de GitHub Copilot, esto te interesa. &lt;a href=&quot;https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/&quot; target=&quot;_blank&quot;&gt;Se vienen cambios para proteger la calidad del servicio&lt;/a&gt; ante el aumento de la demanda actual: nuevos registros en pausa, límites de uso más estrictos, modelos retirados...&lt;/p&gt;&lt;p&gt;Igor Roztropiński reflexiona sobre la complejidad del desarrollo frontend moderno, y &lt;a href=&quot;https://binaryigor.com/modern-frontend-complexity.html&quot; target=&quot;_blank&quot;&gt;se pregunta si es esencial o realmente innecesaria&lt;/a&gt;, proponiendo otros enfoques para reducirlo.&lt;/p&gt;
&lt;p&gt;Gerson Azabache nos recuerda que los microservicios &lt;a href=&quot;https://bravedeveloper.com/2026/04/19/el-dia-que-entendi-que-los-microservicios-no-eran-la-solucion-para-todo/&quot; target=&quot;_blank&quot;&gt;no son un objetivo sino una herramienta&lt;/a&gt;, y no encajan en todo tipo de proyectos.&lt;/p&gt;&lt;p&gt;Y por último, ¿el modelo Claude se llama así por puro chovinismo francés? Seguro que muchos pensábamos que sí. Pero CampusMVP nos cuenta &lt;a href=&quot;https://www.campusmvp.es/recursos/post/por-que-la-ia-de-anthropic-se-llama-claude-y-que-tiene-que-ver-con-el-padre-del-mundo-digital.aspx&quot; target=&quot;_blank&quot;&gt;qué hay detrás de este nombre&lt;/a&gt;, todo un homenaje al padre de la teoría de la información y uno de los pioneros de la informática moderna.&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/2025/03/tech-on-toilet-aprovechando-esos.html&quot;&gt;Tech on the Toilet: aprovechando &quot;esos ratillos&quot; para mejorar la calidad de nuestro software&lt;/a&gt;&lt;br /&gt;
José M. Aguilar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.variablenotfound.com/2019/06/indices-y-rangos-en-c-8-1-de-2.html&quot;&gt;Índices y rangos en C# 8 (1 de 2)&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://dev.to/romnyd/fluentvalidation-en-net-10-sin-ensuciar-tus-entidades-clean-architecture-mediatr-cd7&quot;&gt;FluentValidation en .NET 10 sin ensuciar tus entidades (Clean Architecture + MediatR)&lt;/a&gt;&lt;br /&gt;
Romny Duarte&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/&quot;&gt;Writing Node.js addons with .NET Native AOT&lt;/a&gt;&lt;br /&gt;
Drew Noakes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-10-0-7-oob-security-update/&quot;&gt;.NET 10.0.7 Out-of-Band Security Update&lt;/a&gt;&lt;br /&gt;
Rahul Bhandari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/removingbyte-array-allocations-in-dotnet-framework-using-readonlyspan-t/&quot;&gt;Removing byte[] allocations in .NET Framework using ReadOnlySpan&amp;lt;T&amp;gt;&lt;/a&gt;&lt;br /&gt;
Andrew Lock&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/audit-trail-dotnet-cli-tools/&quot;&gt;Who Ran That Migration?&lt;/a&gt;&lt;br /&gt;
Martin Stühmer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.milanjovanovic.tech/blog/why-i-switched-to-primary-constructors-for-di-in-csharp&quot;&gt;Why I Switched to Primary Constructors for DI in C#&lt;/a&gt;&lt;br /&gt;
Milan Jovanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/evaluating-cron-and-rrule-expressions-in-dotnet.htm&quot;&gt;Evaluating CRON and RRule expressions in .NET&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/&quot;&gt;What&#39;s new for .NET in Ubuntu 26.04&lt;/a&gt;&lt;br /&gt;
Richard Lander&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weblog.west-wind.com/posts/2026/Apr/20/Revisiting-C-Scripting-with-the-WestwindScripting-Templating-Library-Part-1&quot;&gt;Revisiting C# Scripting with the Westwind.Scripting Templating Library, Part 1&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://weblog.west-wind.com/posts/2026/Apr/23/Putting-the-WestwindScripting-Templating-Library-to-work-Part-2&quot;&gt;Putting the Westwind.Scripting Templating Library to work, Part 2&lt;/a&gt;&lt;br /&gt;
Rick Strahl&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/ai-smart-search-blazor-file-manager&quot;&gt;AI-Powered File Search in Blazor File Manager: Semantic and Tag-Based&lt;/a&gt;&lt;br /&gt;
Keerthana Rajendran&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/simplest-way-secure-minimal-api-with-swagger&quot;&gt;The simplest way to secure a Minimal API (With Swagger)&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/blazor-basics-getting-started-blazor-development-vs-code&quot;&gt;Blazor Basics: Getting Started with Blazor Development in VS Code&lt;/a&gt;&lt;br /&gt;
Claudio Bernasconi&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/2026/04/19/el-dia-que-entendi-que-los-microservicios-no-eran-la-solucion-para-todo/&quot;&gt;El día que entendí que los microservicios no eran la solución para todo&lt;/a&gt;&lt;br /&gt;
Gerson Azabache Martínez&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://newsletter.techworld-with-milan.com/p/the-20-software-engineering-laws&quot;&gt;The 20 Software Engineering Laws&lt;/a&gt;&lt;br /&gt;
Dr Milan Milanović&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/multi-factor-authentication-azure-ad-b2c/&quot;&gt;Security Cosplay: Your Password-Only Admin Panel Isn&#39;t Fooling Anyone&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://daily-devops.net/posts/compliance-verification-dotnet-cli/&quot;&gt;Certified, Filed, Forgotten: The Compliance Trainwreck&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://blog.elmah.io/12-practices-for-optimizing-postgresql-queries-for-large-datasets/&quot;&gt;12 practices for optimizing PostgreSQL queries for large datasets&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/por-que-la-ia-de-anthropic-se-llama-claude-y-que-tiene-que-ver-con-el-padre-del-mundo-digital.aspx&quot;&gt;Por qué la IA de Anthropic se llama Claude (y por qué sin &quot;Claude&quot; no existiría la tecnología actual)&lt;/a&gt;&lt;br /&gt;CampusMVP&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.elladodelmal.com/2026/04/jailbreaking-nano-banana-just-for-fun.html&quot;&gt;Jailbreaking Nano Banana Just for Fun &amp;amp; Laughs&lt;/a&gt;&lt;br /&gt;
Chema Alonso&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-chatgpt-images-2-0/&quot;&gt;Introducing ChatGPT Images 2.0&lt;/a&gt;&lt;br /&gt;
openAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-gpt-5-5/&quot;&gt;Introducing GPT-5.5&lt;/a&gt;&lt;br /&gt;
OpenAI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-design-anthropic-labs&quot;&gt;Introducing Claude Design by Anthropic Labs \ Anthropic&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/&quot;&gt;Changes to GitHub Copilot Individual plans&lt;/a&gt;&lt;br /&gt;
Joe Binder&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/securing-mcp-a-control-plane-for-agent-tool-execution&quot;&gt;Securing MCP: A Control Plane for Agent Tool Execution&lt;/a&gt;&lt;br /&gt;
Jack Batzner&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-7-0-beta/&quot;&gt;Announcing TypeScript 7.0 Beta&lt;/a&gt;&lt;br /&gt;
Gary Hepting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://binaryigor.com/modern-frontend-complexity.html&quot;&gt;Modern Frontend Complexity: essential or accidental?&lt;/a&gt;&lt;br /&gt;
Igor Roztropiński&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/markdown-astro/&quot;&gt;Markdown + Astro = ❤️&lt;/a&gt;&lt;br /&gt;
Zell Liew&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/the-web-is-fun-again-first-experiments-with-html-in-canvas/&quot;&gt;The Web Is Fun Again: First Experiments with HTML in Canvas&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://allthingssmitty.com/2026/04/20/why-i-dont-chain-everything-in-javascript-anymore/&quot;&gt;Why I don&#39;t chain everything in JavaScript anymore&lt;/a&gt;&lt;br /&gt;
Matt Smith&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/recreating-apples-vision-pro-animation-in-css/&quot;&gt;Recreating Apple’s Vision Pro Animation in CSS&lt;/a&gt;&lt;br /&gt;
John Rhea&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/constructable-stylesheets-and-adoptedstylesheets-one-parse-every-shadow-root/&quot;&gt;Constructable Stylesheets and adoptedStyleSheets: One Parse, Every Shadow Root&lt;/a&gt;&lt;br /&gt;
Rob Levin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/angular-grid-scale-how-kendo-ui-handles-millions-rows&quot;&gt;Angular Grid at Scale: How Kendo UI Handles Millions of Rows&lt;/a&gt;&lt;br /&gt;
Dany Paredes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/langchainjs-for-beginners&quot;&gt;LangChain.js for Beginners: A Free Course to Build Agentic AI Apps with JavaScript&lt;/a&gt;&lt;br /&gt;
Yohan Lasorsa&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tenphi.me/blog/why-i-spent-years-trying-to-make-css-states-predictable/&quot;&gt;Why I spent years trying to make CSS states predictable — tenphi.me&lt;/a&gt;&lt;br /&gt;
Andrey Yamanov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.readwriterachel.com/things-i-learned/2026/04/23/back-to-basics-react-variables.html&quot;&gt;3 ways to store variables in React, and why you shouldn&#39;t sleep on useRef&lt;/a&gt;&lt;br /&gt;
Rachel Kaufman&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://elbruno.com/2026/04/20/%f0%9f%9a%80-meet-t2i-the-elbruno-text2image-cli/&quot;&gt;Meet t2i — The ElBruno.Text2Image CLI&lt;/a&gt;&lt;br /&gt;
Bruno Capuano&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Otros&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jmalarcon.es/posts/ia-y-trabajo-quien-gana-quien-sobra&quot;&gt;IA y trabajo: quién gana (y quién sobra) en la nueva era laboral&lt;/a&gt;&lt;br /&gt;José Manuel Alarcón&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20260421-00/?p=112247&quot;&gt;Sure, xor&#39;ing a register with itself is the idiom for zeroing it out, but why not sub?&lt;/a&gt;&lt;br /&gt;Raymond Chen&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/6963594273154501947/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/6963594273154501947' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6963594273154501947'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/6963594273154501947'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/04/enlaces-interesantes-646.html' title='Enlaces interesantes 646'/><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/AVvXsEj-01438Vmwm75h3tK28M2m2K-z4C0lovy2WzORRZvL8E7SJ_HT4WZiE_pcY9t1S85yG_-QUkWsk41-nspYC_HIe2avmTNUIzN8gcbFzhFUNZsG6yAC9twVDzmCInZCjFEkTArHnHYcZpKrzCla3Mk1M6OzQ0lfSSfc2ADxj9v9bQ0gxVkgPinCdg/s72-c/ts7-beta.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-908126781594666489</id><published>2026-04-20T07:45:00.040+02:00</published><updated>2026-04-20T07:45:00.121+02:00</updated><title type='text'>Enlaces interesantes 645</title><content type='html'>&lt;img alt=&quot;Desarrollador programando un cerebro con C#&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscZxz99dEMaMIZxtt5UPEMcRbum19GLOGQganYziJY44PjWB3d1UdxwgD5eSYr-B2k2fvczX7Uy10ghUG-fNrRfHc87aBOccnw0fSSncJD2XWtFtmlB6VUVwiO968vma515pifL7IRIVLEZQ09I53w3-VQ5TqQor5htk6ekTL89RycgN5Qo6fag/s800/inferencia-csharp.jpg&quot; width=&quot;100%&quot; /&gt;
&lt;p&gt;Vamos una semana más con los enlaces a contenidos que me han llamado la atención durante los últimos días.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Entre ellos, vale la pena destacar que se ha anunciado la &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-3/&quot; target=&quot;_blank&quot;&gt;tercera preview de .NET 11&lt;/a&gt;, con novedades en C#, librerías, runtime, SDK, ASP.NET Core, Entity Framework y más. &lt;a href=&quot;https://antondevtips.com/blog/new-features-in-dotnet-11-preview-3&quot; target=&quot;_blank&quot;&gt;Las explica bastante bien Anton Martyniuk en su blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;¿Los modelos LLM heredan comportamientos de sus &quot;padres&quot;? José Manuel Alarcón comparte un estudio reciente que sugiere que&amp;nbsp;&lt;a href=&quot;https://www.linkedin.com/pulse/el-pedigr%C3%AD-de-los-modelos-ia-y-c%C3%B3mo-heredan-sesgos-alarc%C3%B3n-agu%C3%ADn-ixpge/&quot; target=&quot;_blank&quot;&gt;los modelos de lenguaje heredan sesgos cuando son entrenados con contenidos sintéticos&lt;/a&gt;. Muy interesante y da para reflexionar un rato sobre lo que viene. 
&lt;/p&gt;
&lt;p&gt;También me ha parecido muy llamativo el proyecto personal de Konrad Kokosa, &lt;a href=&quot;https://kokosa.dev/blog/2026/dotllm/&quot; target=&quot;_blank&quot;&gt;dotLLM, un motor de inferencia LLM escrito por completo en C#&lt;/a&gt;. En su blog explica cómo lo ha construido y los retos a los que se ha enfrentado.&lt;/p&gt;&lt;p&gt;Si trabajáis con Visual Studio y aún no habéis tenido ocasión de probar &lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/stop-hunting-bugs-meet-the-new-visual-studio-debugger-agent/&quot; target=&quot;_blank&quot;&gt;el agente de depuración de GitHub Copilot&lt;/a&gt;, en este post de Harshada Hole encontraréis un vídeo que muestra su uso (podéis ponerle el audio en español).&lt;/p&gt;&lt;p&gt;Y Martin Stühmer nos recuerda que&amp;nbsp;&lt;a href=&quot;https://daily-devops.net/posts/managed-identity-rbac-azure-resources/&quot; target=&quot;_blank&quot;&gt;almacenar secretos en appsettings.json es una mala idea&lt;/a&gt;, y muestra cómo podemos migrar a una solución más segura usando herramientas de Azure como Managed Identity y RBAC.&lt;/p&gt;&lt;div&gt;El resto de enlaces, a continuación.&lt;/div&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/03/liberar-automaticamente-servicios.html&quot;&gt;Liberar automáticamente servicios creados de forma manual 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/05/value-converters-en-entity-framework.html&quot;&gt;Value Converters 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.developerro.com/2026/04/15/logs-dotnet-hoy/&quot;&gt;Hacer logs en .NET hoy&lt;/a&gt;&lt;br /&gt;
Fernando Escolar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-3/&quot;&gt;.NET 11 Preview 3 is now available!&lt;/a&gt;&lt;br /&gt;
Michael Taylor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://antondevtips.com/blog/new-features-in-dotnet-11-preview-3&quot;&gt;New Features in .NET 11 Preview 3&lt;/a&gt;&lt;br /&gt;
Anton Martyniuk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nockawa.github.io/blog/why-building-database-engine-in-csharp/&quot;&gt;Why I&#39;m Building a Database Engine in C#&lt;/a&gt;&lt;br /&gt;
Loïc Baumann&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/12/building-a-vs-codestyle-extension-system-in-c&quot;&gt;Building a VS Code-Style Extension System in C#&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kokosa.dev/blog/2026/dotllm/&quot;&gt;Introducing dotLLM - Building an LLM Inference Engine in C#&lt;/a&gt;&lt;br /&gt;
Konrad Kokosa&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/&quot;&gt;Agent Skills in .NET: Three Ways to Author, One Provider to Run Them&lt;/a&gt;&lt;br /&gt;
Sergey Menshykh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/llm-chat-in-net-with-ichatclient-the-complete-guide/&quot;&gt;LLM Chat in .NET with IChatClient: The Complete Guide&lt;/a&gt;&lt;br /&gt;
NDepend Team&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.roundthecode.com/dotnet-tutorials/validate-dotnet-configuration-startup&quot;&gt;Validate .NET configuration on startup&lt;/a&gt;&lt;br /&gt;
David Grace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meziantou.net/suppressing-roslyn-analyzer-warnings-programmatically-using-diagnosticsuppressor.htm&quot;&gt;Suppressing Roslyn Analyzer Warnings Programmatically using DiagnosticSuppressor&lt;/a&gt;&lt;br /&gt;
Gérald Barré&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/14/c-string-comparison-equals-ordinalignorecase-stringcomparer-and-culture-pitfalls&quot;&gt;C# String Comparison: Equals, OrdinalIgnoreCase, StringComparer, and Culture Pitfalls&lt;/a&gt;&lt;br /&gt;
Nick Cosentino&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endjin.com/blog/csharp-linq-max-nullable-values&quot;&gt;LINQ Max and nullable value types&lt;/a&gt;&lt;br /&gt;
Ian Griffiths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.devleader.ca/2026/04/16/how-to-implement-command-pattern-in-c-stepbystep-guide&quot;&gt;How to Implement Command Pattern in C#: Step-by-Step 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/blazor-ai-content-creation-app-structured-prompting&quot;&gt;Build an AI Content Creation App in Blazor with AI AssistView&lt;/a&gt;&lt;br /&gt;
Arulraj Aboorvasamy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daily-devops.net/posts/purpose-limitation-api-design/&quot;&gt;Purpose Limitation in API Design: Leaking Data You Shouldn&#39;t&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/managed-identity-rbac-azure-resources/&quot;&gt;&quot;We Store Secrets in appsettings.json&quot;: A Horror Story in Five Acts&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://heather.cafe/posts/too_much_xor_swap_trick/&quot;&gt;Too much Discussion of the XOR swap trick&lt;/a&gt;&lt;br /&gt;
Chris Jefferson&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeopinion.com/why-clean-code-is-killing-your-velocity/&quot;&gt;Why “Clean Code” is Killing Your Velocity&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developersvoice.com/blog/architecture/clean-architecture-vertical-slices-refactoring-guide/&quot;&gt;Clean Code to Clean Architecture: Refactoring Fat Controllers into Vertical Slices in ASP.NET Core&lt;/a&gt;&lt;br /&gt;
Sudhir Mangla&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://json5.org/&quot;&gt;JSON5 – JSON for Humans&lt;/a&gt;&lt;br /&gt;
JSON5&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Data&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.elmah.io/ef-core-query-translation-why-does-some-linq-never-become-sql/&quot;&gt;EF Core query translation: Why does some LINQ never become SQL?&lt;/a&gt;&lt;br /&gt;
Ali Hamza Ansari&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/take-your-postgresql-backed-apps-to-the-next-level&quot;&gt;Take your PostgreSQL-backed apps to the next level&lt;/a&gt;&lt;br /&gt;
Ismael Mejía&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://barretblake.dev/posts/development/2026/04/ef-migrations-best-practices/&quot;&gt;EF Core Migrations Best Practices&lt;/a&gt;&lt;br /&gt;
Peter Ritchie&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-7&quot;&gt;Introducing Claude Opus 4.7&lt;/a&gt;&lt;br /&gt;
Anthropic&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andrewlock.net/running-ai-agents-with-customized-templates-in-docker-sandbox/&quot;&gt;Running AI agents with customized templates using docker sandbox&lt;/a&gt;&lt;br /&gt;
Andrew Lock&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/2026/04/github-pages-seguridad-csp/&quot;&gt;Seguridad en GitHub Pages con CSP&lt;/a&gt;&lt;br /&gt;
Gisela Torres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/7-view-transitions-recipes-to-try/&quot;&gt;7 View Transitions Recipes to Try&lt;/a&gt;&lt;br /&gt;
Sunkanmi Fafowora&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/ai-generated-ui-is-inaccessible-by-default/&quot;&gt;AI-Generated UI Is Inaccessible by Default&lt;/a&gt;&lt;br /&gt;
Durgesh Rajubhai Pawar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-radio-state-machine/&quot;&gt;The Radio State Machine&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csswizardry.com/2026/04/font-family-doesnt-fall-back-the-way-you-think/&quot;&gt;font-family Doesn’t Fall Back the Way You Think – CSS Wizardry&lt;/a&gt;&lt;br /&gt;
Harry Roberts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/blog/building-a-ui-without-breakpoints/&quot;&gt;Building a UI Without Breakpoints&lt;/a&gt;&lt;br /&gt;
Amit Sheen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/the-javascript-module-system-architecture/&quot;&gt;A Well-Designed JavaScript Module System is Your First Architecture Decision&lt;/a&gt;&lt;br /&gt;
Amejimaobari Victor&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/whats-important-9/&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.telerik.com/blogs/10-best-angular-ui-libraries&quot;&gt;The 10 Best Angular UI Libraries&lt;/a&gt;&lt;br /&gt;
Dany Paredes&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/modo-fleet-en-github-copilot-cli-guia-practica-para-lanzar-agentes-en-paralelo.aspx&quot;&gt;Modo &quot;fleet&quot; en GitHub Copilot CLI: guía práctica para lanzar agentes en paralelo&lt;/a&gt;&lt;br /&gt;
José Manuel Alarcón&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/siddharthvaddem/openscreen&quot;&gt;openscreen: Create stunning demos for free. Open-source, no subscriptions, no watermarks, and free for commercial use&lt;/a&gt;&lt;br /&gt;
Siddharth Vaddem&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/stop-hunting-bugs-meet-the-new-visual-studio-debugger-agent/&quot;&gt;Stop Hunting Bugs: Meet the New Visual Studio Debugger Agent Workflow&lt;/a&gt;&lt;br /&gt;
Abhas Bhattacharya&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/&quot;&gt;Azure MCP tools now ship built into Visual Studio 2022 — no extension required&lt;/a&gt;&lt;br /&gt;
Yun Jung Choi&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ndepend.com/the-road-to-visual-studio-2027/&quot;&gt;The Road to Visual Studio 2027&lt;/a&gt;&lt;br /&gt;
NDepend Team&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://redth.github.io/MAUI.Sherpa/&quot;&gt;MAUI Sherpa — Your Guide to .NET MAUI Development&lt;/a&gt;&lt;br /&gt;
Jonathan Dick&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/dotnet-maui-listview-vs-collectionview&quot;&gt;.NET MAUI ListView vs CollectionView: How Syncfusion ListView Performs Better&lt;/a&gt;&lt;br /&gt;
Anandh Ganesan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.syncfusion.com/blogs/post/managing-state-in-dotnet-maui&quot;&gt;.NET MAUI State Management: From ViewModels to App Stores&lt;/a&gt;&lt;br /&gt;
Sri Radhesh Nag Subash Sankar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.telerik.com/blogs/building-instagram-style-like-animation-net-maui&quot;&gt;Building an Instagram-Style Like Animation 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/20260414-00/?p=112231&quot;&gt;Why was there a red telephone at every receptionist desk?&lt;/a&gt;&lt;br /&gt;
Raymond Chen&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/908126781594666489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/908126781594666489' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/908126781594666489'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/908126781594666489'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/04/enlaces-interesantes-645.html' title='Enlaces interesantes 645'/><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/AVvXsEiscZxz99dEMaMIZxtt5UPEMcRbum19GLOGQganYziJY44PjWB3d1UdxwgD5eSYr-B2k2fvczX7Uy10ghUG-fNrRfHc87aBOccnw0fSSncJD2XWtFtmlB6VUVwiO968vma515pifL7IRIVLEZQ09I53w3-VQ5TqQor5htk6ekTL89RycgN5Qo6fag/s72-c/inferencia-csharp.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-5925834364849040631</id><published>2026-04-14T08:02:00.002+02:00</published><updated>2026-04-14T08:02:00.115+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="optimización"/><category scheme="http://www.blogger.com/atom/ns#" term="trucos"/><title type='text'>Mejora el rendimiento de string.Format() usando CompositeFormat</title><content type='html'>&lt;img alt=&quot;Desarrolladores manipulando cadenas&quot; border=&quot;0&quot; class=&quot;post-header-image&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBYsMWimvhZzlEbNnftT_i70mUEzguFLWNBHPSMrVSQ9Qq_Z2KxfxsrZ-zBE2jgTIsm2ftnJTTA3bZUOP16ntP4Dtxf6tgomZCjZW_KqJZYM8-guzjUMAoERWCR7i-UyMDcPHSwv8DqIIShT_xzFsnUmT5xPgkIarpoXBu7AKF6Emesfh_n7R_jw/s320/CompositeFormat.jpg&quot; width=&quot;100%&quot; /&gt;

&lt;p&gt;En .NET, todos hemos usado &lt;code&gt;string.Format()&lt;/code&gt; cientos de veces. Se trata de una de esas herramientas que llevamos desde siempre en nuestro cinturón y usamos sin pensar demasiado en las implicaciones de rendimiento que puede tener su uso intensivo en escenarios críticos.&lt;/p&gt;
&lt;p&gt;Sin embargo, cuando lo utilizamos en aplicaciones de alto rendimiento, en bucles con muchas iteraciones o en sistemas con limitaciones de recursos, es importante pararse un poco a pensar sobre cómo optimizar su uso.&lt;/p&gt;
&lt;p&gt;En este artículo exploraremos cómo mejorar el rendimiento de &lt;code&gt;string.Format()&lt;/code&gt; utilizando la clase &lt;code&gt;CompositeFormat&lt;/code&gt; en .NET, que nos permite evitar el coste de analizar la cadena de formato cada vez que se llama al método.&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;El problema con &lt;code&gt;string.Format()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Observemos un ejemplo típico de uso de &lt;code&gt;string.Format()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;for(var i = 0; i &amp;lt; 100_000; i++)
{
    var str = string.Format(&quot;Loop {0} started at {1}&quot;, i, DateTime.Now);
    Console.WriteLine(str);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como podemos ver, en cada iteración del bucle se llama a &lt;code&gt;string.Format()&lt;/code&gt; para obtener el mensaje que justo después es mostrado en la consola. El problema aquí es que &lt;strong&gt;cada llamada a &lt;code&gt;string.Format()&lt;/code&gt; es independiente de las anteriores&lt;/strong&gt;, lo que implica que, en cada vuelta, la cadena de formato &lt;code&gt;&quot;Loop {0} started at {1}&quot;&lt;/code&gt; debe ser &lt;em&gt;parseada&lt;/em&gt; para detectar los marcadores de posición, y luego reemplazarlos con los valores correspondientes.&lt;/p&gt;
&lt;p&gt;De forma intuitiva, podemos ver claro que se trata de dos tareas diferentes: primero se analiza la cadena de formato y luego se realiza el reemplazo de valores. La segunda de ellas es inevitable, pero, ¿podríamos evitar la primera reutilizando el resultado del &lt;em&gt;parseado&lt;/em&gt; de la cadena de formato entre las distintas llamadas?&lt;/p&gt;
&lt;h2&gt;Introducing &lt;code&gt;CompositeFormat&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La clase &lt;code&gt;CompositeFormat&lt;/code&gt;, introducida en .NET 8, nos permite hacer precisamente eso. En lugar de llamar a &lt;code&gt;string.Format()&lt;/code&gt; directamente, podemos crear una instancia de &lt;code&gt;CompositeFormat&lt;/code&gt; con la cadena de formato &lt;em&gt;parseada&lt;/em&gt;, y luego reutilizar esa instancia para formatear múltiples mensajes.&lt;/p&gt;
&lt;p&gt;Aquí tenéis un ejemplo de cómo hacerlo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cs&quot;&gt;var format = CompositeFormat.Parse(&quot;Loop {0} started at {1}&quot;);
for (int i = 0; i &amp;lt; 100_000; i++)
{
    var str = string.Format(null, format, i, DateTime.Now);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como podéis ver, la cadena de formato se analiza una sola vez al crear la instancia de &lt;code&gt;CompositeFormat&lt;/code&gt;, y luego se reutiliza en cada iteración del bucle. Esto reduce significativamente el coste de procesamiento, especialmente cuando el número de iteraciones es alto. Incluso podría mejorarse ligeramente si el objeto &lt;code&gt;CompositeFormat&lt;/code&gt; se crea una única vez, como variable estática, y se reutiliza en todas las llamadas.&lt;/p&gt;
&lt;p&gt;Si utilizamos &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 estos enfoques, obtenemos los siguientes resultados:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7462/25H2/2025Update/HudsonValley2)
Intel Core i9-9900K CPU 3.60GHz (Coffee Lake), 1 CPU, 16 logical and 8 physical cores
.NET SDK 10.0.101
  [Host]     : .NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3
  DefaultJob : .NET 10.0.1 (10.0.1, 10.0.125.57005), X64 RyuJIT x86-64-v3

| Method                    | Mean     | Error    | StdDev   | Gen0      | Allocated |
|-------------------------- |---------:|---------:|---------:|----------:|----------:|
| UsingStandardStringFormat | 20.24 ms | 0.103 ms | 0.091 ms | 1812.5000 |   14.5 MB |
| UsingCompositeFormat | 17.97 ms | 0.096 ms | 0.089 ms | 1218.7500 |   9.92 MB |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El &lt;strong&gt;uso de la CPU se ha reducido en un 11,2%&lt;/strong&gt;, y la cantidad de &lt;strong&gt;memoria asignada se redujo en un 31,6%&lt;/strong&gt;, unos números nada despreciables.&lt;/p&gt;
&lt;p&gt;Es importante tener en cuenta que el beneficio &lt;strong&gt;podría variar dependiendo de la complejidad de la cadena de formato&lt;/strong&gt;. Por ejemplo, consideremos una cadena de formato más rebuscada como la siguiente, donde mostramos los mismos dos parámetros varias veces, pero con diferentes formatos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;ID:{0:D5} | Hex:0x{0:X8} | Padded:[{0,8}] | Num:{0:N0} | 
Time:{1:yyyy-MM-dd HH:mm:ss.fff} | Short:{1:dd/MM/yy} | ISO:{1:O}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Al ejecutar las mismas pruebas con esta cadena de formato más compleja, obtenemos los siguientes resultados:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method                    | Mean     | Error    | StdDev   | Gen0      | Allocated |
|-------------------------- |---------:|---------:|---------:|----------:|----------:|
| UsingStandardStringFormat | 59.31 ms | 0.292 ms | 0.259 ms | 4666.6667 |  38.06 MB |
| UsingCompositeFormat      | 47.32 ms | 0.300 ms | 0.281 ms | 3727.2727 |  30.44 MB |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En este caso, observamos una &lt;strong&gt;reducción del 20% en el uso de CPU&lt;/strong&gt;, que demuestra que el proceso de &lt;em&gt;parseado&lt;/em&gt; de la cadena es más costoso cuando no se reutiliza. El uso de la memoria usando &lt;code&gt;CompositeFormat&lt;/code&gt; también mejora un 20% respecto a &lt;code&gt;string.Format()&lt;/code&gt;, aunque en menor medida que antes debido a que el tamaño de las cadenas resultantes es mayor en ambos casos, y esto hace que la diferencia porcentualmente sea menor.&lt;/p&gt;
&lt;h2&gt;Punto extra: ¿por qué las cadenas interpoladas son mejores que ambas opciones?&lt;/h2&gt;
&lt;p&gt;Aunque &lt;code&gt;CompositeFormat&lt;/code&gt; pueda parecer la panacea para mejorar el rendimiento de &lt;code&gt;string.Format()&lt;/code&gt;, en realidad, las cadenas interpoladas (&lt;code&gt;$&quot;...&quot;&lt;/code&gt;) son una opción aún mejor en términos de rendimiento y legibilidad.&lt;/p&gt;
&lt;p&gt;De hecho, en general, deberíamos utilizar cadenas interpoladas (&lt;code&gt;$&quot;...&quot;&lt;/code&gt;) en lugar de &lt;code&gt;string.Format()&lt;/code&gt; o &lt;code&gt;CompositeFormat&lt;/code&gt; siempre que sea posible. Las cadenas interpoladas son más legibles y se resuelven en tiempo de compilación, por lo que el compilador puede optimizarlas mejor y generar un código más eficiente. Podemos verlo en el siguiente &lt;em&gt;benchmark&lt;/em&gt; comparativo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;| Method                  | Mean     | Error    | StdDev   | Gen0      | Allocated |
|------------------------ |---------:|---------:|---------:|----------:|----------:|
| StandardStringFormat    | 60.85 ms | 0.412 ms | 0.385 ms | 4666.6667 |  38.06 MB |
| UsingCompositeFormat    | 47.47 ms | 0.382 ms | 0.357 ms | 3727.2727 |  30.44 MB |
| UsingInterpolatedString | 37.34 ms | 0.236 ms | 0.197 ms | 3785.7143 |  30.44 MB |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Según los resultados, las cadenas interpoladas son un &lt;strong&gt;38,7% más rápidas que &lt;code&gt;string.Format()&lt;/code&gt;&lt;/strong&gt; y un &lt;strong&gt;21,3% más rápidas que &lt;code&gt;CompositeFormat&lt;/code&gt;&lt;/strong&gt;. Además, el uso de memoria es similar al de &lt;code&gt;CompositeFormat&lt;/code&gt;, lo que las convierte en la opción preferida cuando la cadena de formato es conocida de antemano.&lt;/p&gt;
&lt;p&gt;Para el resto de los casos, siempre y cuando el formateo de la cadena se encuentre en bucles o &lt;em&gt;hot paths&lt;/em&gt;, &lt;code&gt;CompositeFormat&lt;/code&gt; será la opción más eficiente. Pero ojo, ¡no hay que volverse locos con las micro-optimizaciones!&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/5925834364849040631/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/27752126/5925834364849040631' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/5925834364849040631'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/27752126/posts/default/5925834364849040631'/><link rel='alternate' type='text/html' href='https://www.variablenotfound.com/2026/04/mejora-el-rendimiento-de-stringformat.html' title='Mejora el rendimiento de string.Format() usando CompositeFormat'/><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/AVvXsEjBYsMWimvhZzlEbNnftT_i70mUEzguFLWNBHPSMrVSQ9Qq_Z2KxfxsrZ-zBE2jgTIsm2ftnJTTA3bZUOP16ntP4Dtxf6tgomZCjZW_KqJZYM8-guzjUMAoERWCR7i-UyMDcPHSwv8DqIIShT_xzFsnUmT5xPgkIarpoXBu7AKF6Emesfh_n7R_jw/s72-c/CompositeFormat.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27752126.post-3837292177887920600</id><published>2026-04-13T08:01:00.002+02:00</published><updated>2026-04-14T08:31:14.007+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enlaces"/><title type='text'>Enlaces interesantes 644</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 644'/><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='2 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>2</thr:total></entry></feed>