Publicado por José M. Aguilar a las 8:00 a. m.
Etiquetas: blogging, vacaciones
El 1 de julio de 2011 recibí por primera vez la notificación de que había sido reconocido como Microsoft MVP (Most Valuable Professional). Fue una sorpresa en toda regla, porque nunca pensé que mis aportaciones a la comunidad fueran lo suficientemente relevantes como para merecer este reconocimiento y, por supuesto, tampoco podía sospechar que alguien me hubiera nominado para ello.
No era consciente del impacto que ese nombramiento tendría en mi vida profesional y personal a partir de ese momento, pero sí del honor, con su correspondiente parte de vértigo y síndrome del impostor, que suponía formar parte de aquel grupo selecto de personas que compartían su experiencia y conocimientos con la comunidad de desarrolladores, y a las que admiraba desde hacía tiempo.
Desde entonces, cada mes de julio he seguido recibiendo puntualmente este nombramiento de manera consecutiva, y ayer me notificaron oficialmente el decimosexto reconocimiento como Microsoft MVP, por mi contribución a la comunidad de desarrolladores y mi implicación en la difusión de conocimientos sobre tecnologías Microsoft durante el año anterior. Todo un privilegio que me hace sentir muy orgulloso y, sobre todo, profundamente agradecido por haber sido considerado digno de pertenecer a este grupo durante tantos años.
Aprovecho este momento para agradecer a Cristina González Herrero y al resto de miembros del equipo del programa MVP que sigan apoyando mi trabajo y reconociendo mis contribuciones.
También quiero agradecer a todos los que me habéis acompañado en este viaje, ya sea leyendo mis posts, dejando comentarios, compartiendo mis contenidos o, simplemente, apoyando mi trabajo de alguna manera. Sin vosotros, nada de esto habría sido posible.
Y, por supuesto, a mi familia, por su paciencia infinita durante todos estos años. Su apoyo ha sido fundamental para poder llegar hasta aquí, así que este reconocimiento también lo celebraremos juntos, como la ocasión merece 😊
¡Seguimos!
Publicado en: www.variablenotfound.com.
La versión 7.0 final de TypeScript ya está disponible. Si has ido probando las RC, ya habrás visto que el incremento de velocidad en compilación es espectacular. Y si no lo has hecho, estás tardando en actualizar.
David Grace nos muestra cómo es posible registrar los cambios automáticamente utilizando las tablas temporales en EF Core.
Al diseñar una API, cualquier comportamiento que expongamos puede ser utilizado por los clientes, y cambiarlo puede romper sus aplicaciones. Esto se conoce como la Ley de Hyrum, y Oren Eini cuenta cómo les afectó en RavenDB.
Waldek Mastykarz nos recuerda que, cuando hablamos de modelos IA, lo último no es necesariamente lo mejor. Si los adoptamos conforme aparecen, podríamos encontrarnos con sorpresas desagradables, como incrementos de coste, pérdidas de calidad o de predictibilidad. Lo más prudente es probarlos antes en nuestros escenarios concretos, y decidir a partir de ahí.
Los agentes de Microsoft Agent Framework para .NET ya pueden utilizar skills, por lo que podemos proporcionarles conocimientos especializados que cargarán bajo demanda cuando necesiten realizar tareas específicas. Nos lo cuenta Sergey Menshykh.
El resto de enlaces a contenidos interesantes, a continuación.
Por si te lo perdiste...
- La directiva @helper, ¿reencarnada en ASP.NET Core 3?
José M. Aguilar - Evitar el aviso de compilación "NETSDK1057: You are using a preview version of .NET" usando global.json
José M. Aguilar
.NET
- Fin del soporte de .NET 8 y .NET 9
CampusMVP - NuGet Versioning and Semantic Versioning (SemVer) in .NET & NuGet Package Metadata Best Practices: README, Icon, Tags, and License & How to Publish a NuGet Package to NuGet.org
Nick Cosentino - Improvements to reading Process outputs
Andrew Lock - Migrate Your WPF App to the Web, From Your Browser
Xaml.io - Agent Skills for .NET Is Now Released
Sergey Menshykh - You inherited a .NET codebase with zero tests. Now what?
Ebrahim Sayed Ebrahim
Aunque siempre estuvieron ahí, la moda de los agentes IA ha vuelto a llamar al escenario a los worktrees de Git, que permiten trabajar en varias ramas al mismo tiempo sobre el mismo repositorio. En este artículo, José Manuel Alarcón nos explica cómo funcionan y cómo pueden ayudarnos en nuestro día a día.
Cuando lanzamos peticiones desde .NET, lo habitual es esperar a que la respuesta llegue completa antes de procesarla, aunque a veces, si los datos a recibir son masivos, esto no escala bien. Pero, ¿y si pudiéramos procesar los datos a medida que nos van llegando? En este artículo, Nick Cosentino nos explica cómo hacerlo con HttpClient y Server-Sent Events.
Si sigues trabajando con .NET exactamente igual a como lo hacías hace unos años, quizás te vendría bien echar un vistazo al resumen que Simon Foster ha hecho de las novedades que se han ido incorporando a .NET desde la versión 5 hasta la 10, para ver qué cosas nuevas podemos aprovechar.
El resto de enlaces a contenidos interesantes, a continuación.
Por si te lo perdiste...
- Evaluación en cliente de EF Core
José M. Aguilar - Determinar el modo de renderización de un componente Blazor (versión 9 y posteriores)
José M. Aguilar
.NET
- .NET 8 and .NET 9 will reach End of Support on November 10, 2026
Rahul Bhandari - Packaging and Package Identity for .NET apps with WinApp CLI on Windows
Zachary Teutsch - Closed class hierarchies
Andrew Lock - Building an MCP Server in .NET Without Buying the Hype
Martin Stühmer - Claude Skills for .NET: Teach AI to Build Features Your Way
Anton Martyniuk - .NET 5 to 10: Key Features Introduced in Every Release
Simon Foster - Identity vs Principal: Modeling the Current User in .NET — AppointMe
BravoDev - HttpClient Streaming in C#: HttpCompletionOption, ReadAsStreamAsync, and Server-Sent Events
Nick Cosentino - Building a Windows Tray App by combining Microsoft.UI.Reactor and a Worker Project
Morten Nielsen - Writing a .NET Garbage Collector in C#
Kevin Gosse - How to match names in C# without exact string comparisons
Nick Harrison
En Blazor no existen "signals", como en Angular. Sin embargo, es posible crear algo similar, para conseguir que la UI se actualice automáticamente cuando cambian los datos. Steven Giesel nos explica cómo hacerlo.
Rick Strahl nos explica qué opciones tenemos para crear aplicaciones Windows que puedan ejecutarse tanto en modo consola como en modo GUI, y por qué ninguna de ellas es perfecta 👉
Los caracteres de salto de línea no son simplemente a CR y LF. En este post Gérald Barré nos explica qué debemos tener en cuenta para gestionarlos correctamente en .NET.
Y por último, ¿sabías que desde la llegada de .NET 10 hace unos meses puedes ejecutar un archivo C# directamente desde la línea de comandos? Puedes crear scripts, pequeñas utilidades y ejecutarlas de forma rápida sin necesidad de crear y compilar un proyecto completo. En este post te explico cómo hacerlo.
Enlaces a más contenidos interesantes, a continuación.
Por si te lo perdiste...
- Ejecutar directamente archivos C# desde línea de comandos con "dotnet run"
José M. Aguilar - Implementación de servicios gRPC con ASP.NET Core
José M. Aguilar
.NET
- File-based WinUI apps with Microsoft.UI.Reactor
Morten Nielsen - Avoiding ToString() allocations with StringBuilder.MoveChunks
Andrew Lock - TimeProvider Test Patterns That Hold Up in CI and Production
Martin Stühmer - Creating Dual Use Windows GUI and Console Applications
Rick Strahl - New lines are more than \r and \n
Gérald Barré - Can Claude Code build a .NET app with your code style?
David Grace
Seguro que alguna vez os habéis encontrado con la necesidad de usar un servicio registrado como scoped desde el código de un servicio registrado como singleton. Un caso típico es cuando en una aplicación ASP.NET Core tenemos un servicio corriendo en segundo plano (vaya, un BackgroundService) y necesitamos acceder a servicios que usan bases de datos o cualquier otro recurso que está normalmente asociado al ámbito de una petición HTTP.
Si intentamos inyectar directamente un servicio scoped dentro de un servicio singleton, obtendremos un error al iniciar la aplicación, durante el proceso de validación del árbol de dependencias, ya que el contenedor de .NET no permite esta combinación:
System.AggregateException: 'Some services are not able to be constructed
(Error while validating the service descriptor 'ServiceType:
Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType:
MyBackgroundService': Cannot consume scoped service 'MyDbContext' from
singleton 'Microsoft.Extensions.Hosting.IHostedService'.)'
Una posibilidad (peligrosa: ¡no hacer!) es deshabilitar esta validación inicial, pero esto solo ocultaría el problema y casi con toda seguridad nos llevaría más tarde a errores en tiempo de ejecución que podrían ser difíciles de diagnosticar y, en el peor de los casos, incluso tumbarnos la aplicación.
En este post vamos a ver la forma correcta de resolver el problema creando ámbitos personalizados dentro del servicio singleton, y usándolos para resolver los servicios scoped que necesitemos.
¿Deberíamos adoptar ya Blazor como nuestro framework de desarrollo por defecto para las aplicaciones web? Arunachalam Kandasamy analiza los puntos a favor y en contra y nos da consejos para tomar la decisión.
Y sin cambiar de framework, Arulraj Aboorvasamy nos explica cómo gestionar el estado de la aplicación en Blazor para construir aplicaciones escalables.
Se ha presentado Angular 22, y José Manuel Alarcón nos hace un resumen de las novedades más importantes, con muchos ejemplos de código para que podamos entenderlas mejor.
Muchos más enlaces a contenidos interesantes, a continuación.
Por si te lo perdiste...
- Simulando enumerados de texto en C#
José M. Aguilar - Enumerables asíncronos en C#
José M. Aguilar
.NET
- Your first Microsoft.UI.Reactor app
Morten Nielsen - .NET 11: The STS Release With C# 15 Union Types and Runtime-Async
Martin Stühmer - Discriminated unions in C# and .NET 11 (for real this time)
Maarten Balliauw - Strongly typed generic object in C#
Jiří Činčura - Ship your C# MCP Server as a one-click bundle with MCPB
Bart Wullems - dotnet cleanup v2: Quickly Clean Up bin, obj & node_modules Folders
Sebastian Nilsson - Standardize or Drift: One Defaults Package for All Your Solutions
Martin Stühmer - "Optimizing" concurrent regexes
Oren Eini
Esta semana hay que destacar tanto el anuncio a bombo y platillo de los modelos Claude Fable y Mythos 5 de Anthropic... como su retirada unos días después, debido una orden del gobierno de Estados Unidos por motivos de seguridad nacional. Un mundo curioso este 😉
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 podéis encontrar detalladas aquí.
Por último, destacar un artículo sobre el principio DRY, 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.
El resto de enlaces a contenidos interesantes, a continuación.
Por si te lo perdiste...
- Asignaciones seguras con 'null conditional assignments' de C# 14 (.NET 10)
José M. Aguilar - Switch expressions en C# 8
José M. Aguilar
.NET
- Proxies en Go o C#
Fernando Escolar - .NET 11 Preview 5 is now available!
.NET Team - .NET at Microsoft Build 2026: Must watch sessions
Daniel Roth - Microsoft Build 2026 recap: vision, launches, and top sessions
Jon Galloway - Convert HTML to Markdown in C# Without Losing Structure or Images
Mathan Kumar Varadharaja - Model Validation in ASP.NET Core: Data Annotations and FluentValidation
Nick Cosentino - Boost Your .NET Projects: Future-Proofing Performance with Spargine’s Fast Methods
David McCarter - Introducing Corvus.Text.Json V5: Why V5 Exists
Ian Griffiths - The new Visual Studio Solution File Format: Goodbye .SLN, Welcome .SLNX!
Thomas Claudius Huber - C#14 The field keyword
Karen Payne - New features and Roslyn analyzers for Meziantou.Framework.FullPath
Gérald Barré - Introducing Corvus.Text.Json V5: Schema Validation 10x Faster & Pooled-Memory Parsing
Ian Griffiths - TUnit.Mocks: No Castle, No Reflection, No Drama
Martin Stühmer - Creating a Packaged Single File Web Site Viewer Executable
Rick Strahl
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 Result<T> o haciendo algunos malabarismos con composiciones de clases o herencia.
var result = GetUser(1);
if(result.Success)
{
var user = result.Value;
// Hacer algo con el usuario
}
else
{
var error = result.Error;
// Manejar el error
}
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.
Los tipos unión son una de las características más solicitadas en C# durante años, y finalmente los tendremos disponibles en la versión 15 del lenguaje, que vendrá de la mano de NET 11 en noviembre de 2026.
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.
Lo vemos en detalle a continuación.
El evento Microsoft Build 2026 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 😄🤯
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 ofrece consejos basados en su propia experiencia sobre cómo usar GitHub Copilot de forma efectiva, sin quemar el presupuesto de tokens en un rato. Muy recomendable si usas esta herramienta y quieres sacarle el máximo partido.
¿Puede un endpoint de .NET manejar un millón de solicitudes por segundo? 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.
Hector Pérez nos muestra cómo aprovechar las nuevas capacidades de validación de formularios en Blazor 10, con ejemplos prácticos y consejos para mejorar la experiencia de usuario.
Se ha presentado Angular 22, con el nuevo Signal Forms, primitivas de accesibilidad, reactividad asíncrona y otras mejoras, muchas enfocadas en facilitar el desarrollo mediante IA.
Muchos más enlaces a contenidos interesantes de la semana, a continuación.
Por si te lo perdiste...
- Cómo obtener el nombre de la clase actual en .NET
José M. Aguilar - Implementación por defecto en interfaces de C#8, un primer vistazo
José M. Aguilar
.NET
- Microsoft.UI.Reactor: A declarative, component-based C# framework for building WinUI 3 desktop apps Microsoft
- How to Use Build5Nines.SharpVector with Microsoft Agent Framework for Local RAG in C#
Chris Pietschmann - Introducing ReflectionIT.PropertyThrowGenerator - Add compile‑time validated properties to your C# classes with zero boilerplate
Fons Sonnemans - Pointers in C# and Memory Safety: Span vs. C# 16 unsafe
NDepend Team - Getting Started with Claude in .NET
Yohan Malshika
Mientras programamos, todos hemos dicho alguna vez "voy a tomar este atajo", "ya lo solucionaré en el futuro", "lo dejo hardcodeado por ahora"... 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: My biggest enemy writes my code y I’m done making empty promises.
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 refactorizar código con el fin de reducir costes de mantenimiento y mejorar la calidad.
Agentes, agentes IA everywhere... Pero, ¿cómo funcionan por detrás los agentes IA? En este post de Waldek Mastykarz nos explica el flujo de trabajo un agente para que podamos comprenderlo de forma sencilla.
También, Chris Pietschmann nos lleva de nuevo a las bases para revisar los ámbitos de vida de servicios en .NET (Singleton, Scoped y Transient) y entender cuándo usar cada uno de ellos.
Muchos más enlaces interesantes, a continuación.
Por si te lo perdiste...
- Obtener información sobre el origen de la invocación de un método con los atributos "caller info" de .NET
José M. Aguilar - Tipos referencia anulables en C# 8
José M. Aguilar
.NET
- No llames a
BuildServiceProvider()
Fernando Escolar - Automatically getting API difference diagrams in your .NET PRs
Morten Nielsen - C#: Should This Service Be Singleton, Scoped, or Transient?
Chris Pietschmann - The Support Length for .NET LTS and STS versions – Thomas Claudius Huber
Thomas Claudius Huber - In C#, When Should You Use Exceptions, Result Objects, or Validation Errors?
Chris Pietschmann - Python for .NET devs: data types, classes, objects, records and interfaces
Davide Bellone - C# Nullable Types Explained (2026)
NDepend Team
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.
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.
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.
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.
En este artículo vamos a ver qué son los filtros de solución, cómo crearlos y cómo usarlos.
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 qué cambios trae esta actualización para los desarrolladores.
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 diseñar para el fallo parcial en .NET, explorando estrategias para manejar situaciones donde una operación no se completa en su totalidad.
Martin Stühmer nos recuerda que el código que escribimos hoy puede convertirse en un problema para otros, o incluso nosotros mismos, en el futuro, destacando la importancia de escribir código limpio y mantenible.
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 los anchors en CSS podrían poner fin a los cálculos manuales para alinear estos elementos.
Y por último, me ha parecido interesante compartir este artículo de Barry Pollard y Noam Rosenthal sobre las actualizaciones parciales declarativas en Chrome, 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.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Comparación natural de cadenas en .NET 10
José M. Aguilar - Null coalescing assigment "??=", el nuevo operador de asignación en C# 8
José M. Aguilar
.NET
- NuGet Package Pruning: Cleaner Dependencies and Actionable Vulnerability Reports
Nikolche Kolev - Zstandard compression in .NET 11
Steven Giesel - .NET finally gets union types🎉
Andrew Lock - How to build .NET obfuscator
Andrii Kurdiumov - Improving C# Memory Safety
Jaren Duan - Announcing Agent Governance Toolkit MCP Extensions for .NET
Jack Batzner - Six Ways ILogger Silently Fails in Production
Martin Stühmer - Reflection Performance in .NET 10: Benchmarks, Caching, and Delegates
Nick Cosentino
Esta semana se ha lanzado la preview 4 de .NET 11, 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.
Se ha anunciado que la aplicación de escritorio GitHub Copilot, la visión de Microsoft de lo que será el desarrollo agéntico, está ya disponible como technical preview. Si eres suscriptor de GitHub Copilot Pro o Pro+, puedes comenzar a probarla.
Milan Jovanović ha publicado un artículo muy interesante sobre el versionado de APIs, un tema que siempre genera debate y que él aborda desde una perspectiva muy práctica.
David Ortinau anuncia que el runtime de .NET MAUI abandona Mono y se moverá a CoreCLR 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.
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 guía práctica para implementarla en .NET 10, con ejemplos de algoritmos y librerías disponibles.
Por último, David Fowler ha publicado un artículo muy interesante sobre cómo la IA nos ha hecho más rápidos, pero también creó nuevos cuellos de botella que obligan a cambiar procesos y hábitos.
Muchos más enlaces a contenidos interesantes de esta semana, a continuación.
Por si te lo perdiste...
- JavaScriptizando C#: chequeo de nulos usando conversores implícitos
José M. Aguilar - Etiquetado de consultas en Entity Framework Core
José M. Aguilar
.NET
- .NET 11 Preview 4 is now available!
.NET Team - Process API Improvements in .NET 11
Adam Sitnik - BackgroundService exceptions now propagate in .NET 11
Steven Giesel - LINQ Filtering in C#: Where, Any, All, Contains, and OfType & LINQ Aggregation in C#: Count, Sum, Min, Max, Average, and Aggregate
Nick Cosentino - The field Keyword in C# 14: Write Less, Validate More
Khalid Abuhakmeh - Inspecting 3D objects (incl. gltf) with a 28-line C# script • Ben Bowen's Blog
Ben Bowen - Stop Pretending TimeProvider Doesn't Exist
Martin Stühmer - Post-Quantum Cryptography in .NET 10: A Practical Guide
Khalid Abuhakmeh - Creating a Simple MCP Server in .NET
Paul Michaels - 10 .NET Open Source Libraries Every Developer Should Know in 2026
Vikrant Bagal
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.
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.
Han pasado veinte años desde que escribí el primer post en Variable Not Found.
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é.
Muchas gracias a todos los que me habéis acompañado en este viaje, 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.
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, la cosa sigue pintando muy mal: 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 😢
¿Vale la pena seguir adelante? Pues no lo tengo nada claro...
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.
Por destacar algunos, encontramos a Isaac Ojeda hablando de cómo evitar el temido problema N+1 en Entity Framework Core, todo un clásico que merece ser recordado de vez en cuando-
Y otro clásico: cuando queremos crear un nuevo tipo en C#, ¿debería ser una clase, un record, una struct o una interfaz? Chris Pietschmann nos da su opinión al respecto, y una guía práctica para elegir la mejor opción en cada caso.
Martin Stühmer nos advierte sobre los costes ocultos de los Source Generators en .NET, una tecnología muy potente pero que puede afectar al rendimiento de la compilación si no se usa con cuidado.
Mario Rodriguez nos cuenta uno de los cambios que más pueden impactar en equipos y empresas este año: GitHub Copilot pasa a un modelo de facturación por uso. Si trabajas con esta IA a diario, este enlace es casi de lectura obligatoria.
Khalid Abuhakmeh pone el foco en un problema tan común como traicionero en producción: los límites de tamaño de cookies en ASP.NET Core, con causas y soluciones prácticas para evitar sustos en aspectos como autenticación y sesiones.
Oren Eini contrasta cómo se aprendía a programar en los 90 con la forma de hacerlo en la actualidad, y cómo la IA está transformando —y a veces debilitando— la comprensión profunda que necesitan los desarrolladores de hoy.
Esto y mucho más, a continuación.
Por si te lo perdiste...
- Dispara la eficiencia de tus búsquedas en memoria con .NET usando SearchValues
José M. Aguilar - Índices y rangos en C# 8 (2 de 2)
José M. Aguilar
.NET
- Microsoft WinApp CLI: la herramienta que unifica el desarrollo para Windows
José Manuel Alarcón - Cómo manejar fallos transitorios en .NET con Polly y ResiliencePipelineBuilder
Isaac Ojeda - Announcing the WinApp VS Code Extension — Run, Debug, and Package Windows Apps in VS Code -
Chiara Mooney - The best way to create email templates in .NET
David Grace - ConfigurationIgnoreAttribute in .NET 11
Steven Giesel - C# Regex: Complete Guide to Regular Expressions in .NET
Nick Cosentino - Docker Support for Isolator
Ricardo Peres - High-Performance Distributed Caching with .NET and Postgres on Azure
Matthew Schwartz - Welcome to SkiaSharp 4.0 Preview 1
David Ortinau - VSTest is Removing its Newtonsoft.Json Dependency
McKenna Barlow - Your Privacy Docs Are Fiction: Let's Fix That with .NET CLI Tools
Martin Stühmer - Harden Your .NET JSON Deserialization with System.Text.Json and JsonSerializerOptions.Strict
Khalid Abuhakmeh - Introducing ReflectionIT.DisposeGenerator — A Modern Source Generator for the Dispose Pattern
Fons Sonnemans - C# / .NET Performance: Why Is It Slow 'Here' and What Should You Optimize First?
Chris Pietschmann - Multi-layer Caching with the Decorator Pattern
Ian Griffiths - Pattern matching in C#: Advanced scenarios you didn't know
Ali Hamza Ansari - Source Generators: The Build Performance Killer Nobody Warned You About
Martin Stühmer - C# Records
Ricardo Peres - LINQ in C#: Complete Guide to Language Integrated Query (.NET 6-9)
Nick Cosentino - C#: Should This Be a Class, Record, Struct, or Interface?
Chris Pietschmann
Entre los contenidos interesantes de esta semana, se ha anunciado la beta del esperado TypeScript 7.0 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 "beta" 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 "side by side" con las versiones actuales.
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 por qué los usa al aplicar Inyección de Dependencias.
¿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 cómo la inteligencia artificial está transformando el trabajo real, lejos de los discursos apocalípticos o utópicos, y qué deberíamos hacer al respecto.
Por cierto, si usas un plan individual de GitHub Copilot, esto te interesa. Se vienen cambios para proteger la calidad del servicio ante el aumento de la demanda actual: nuevos registros en pausa, límites de uso más estrictos, modelos retirados...
Igor Roztropiński reflexiona sobre la complejidad del desarrollo frontend moderno, y se pregunta si es esencial o realmente innecesaria, proponiendo otros enfoques para reducirlo.
Gerson Azabache nos recuerda que los microservicios no son un objetivo sino una herramienta, y no encajan en todo tipo de proyectos.
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 qué hay detrás de este nombre, todo un homenaje al padre de la teoría de la información y uno de los pioneros de la informática moderna.
El resto de enlaces a contenidos interesantes, a continuación.
Por si te lo perdiste...
- Tech on the Toilet: aprovechando "esos ratillos" para mejorar la calidad de nuestro software
José M. Aguilar - Índices y rangos en C# 8 (1 de 2)
José M. Aguilar
.NET
- FluentValidation en .NET 10 sin ensuciar tus entidades (Clean Architecture + MediatR)
Romny Duarte - Writing Node.js addons with .NET Native AOT
Drew Noakes - .NET 10.0.7 Out-of-Band Security Update
Rahul Bhandari - Removing byte[] allocations in .NET Framework using ReadOnlySpan<T>
Andrew Lock - Who Ran That Migration?
Martin Stühmer - Why I Switched to Primary Constructors for DI in C#
Milan Jovanović - Evaluating CRON and RRule expressions in .NET
Gérald Barré - What's new for .NET in Ubuntu 26.04
Richard Lander - Revisiting C# Scripting with the Westwind.Scripting Templating Library, Part 1 & Putting the Westwind.Scripting Templating Library to work, Part 2
Rick Strahl
Vamos una semana más con los enlaces a contenidos que me han llamado la atención durante los últimos días.
Entre ellos, vale la pena destacar que se ha anunciado la tercera preview de .NET 11, con novedades en C#, librerías, runtime, SDK, ASP.NET Core, Entity Framework y más. Las explica bastante bien Anton Martyniuk en su blog.
¿Los modelos LLM heredan comportamientos de sus "padres"? José Manuel Alarcón comparte un estudio reciente que sugiere que los modelos de lenguaje heredan sesgos cuando son entrenados con contenidos sintéticos. Muy interesante y da para reflexionar un rato sobre lo que viene.
También me ha parecido muy llamativo el proyecto personal de Konrad Kokosa, dotLLM, un motor de inferencia LLM escrito por completo en C#. En su blog explica cómo lo ha construido y los retos a los que se ha enfrentado.
Si trabajáis con Visual Studio y aún no habéis tenido ocasión de probar el agente de depuración de GitHub Copilot, en este post de Harshada Hole encontraréis un vídeo que muestra su uso (podéis ponerle el audio en español).
Y Martin Stühmer nos recuerda que almacenar secretos en appsettings.json es una mala idea, y muestra cómo podemos migrar a una solución más segura usando herramientas de Azure como Managed Identity y RBAC.
Por si te lo perdiste...
- Liberar automáticamente servicios creados de forma manual en ASP.NET Core
José M. Aguilar - Value Converters en Entity Framework Core
José M. Aguilar
.NET
- Hacer logs en .NET hoy
Fernando Escolar - .NET 11 Preview 3 is now available!
Michael Taylor - New Features in .NET 11 Preview 3
Anton Martyniuk - Why I'm Building a Database Engine in C#
Loïc Baumann - Building a VS Code-Style Extension System in C#
- Nick Cosentino
- Introducing dotLLM - Building an LLM Inference Engine in C#
Konrad Kokosa - Agent Skills in .NET: Three Ways to Author, One Provider to Run Them
Sergey Menshykh - LLM Chat in .NET with IChatClient: The Complete Guide
NDepend Team - Validate .NET configuration on startup
David Grace - Suppressing Roslyn Analyzer Warnings Programmatically using DiagnosticSuppressor
Gérald Barré - C# String Comparison: Equals, OrdinalIgnoreCase, StringComparer, and Culture Pitfalls
Nick Cosentino - LINQ Max and nullable value types
Ian Griffiths - How to Implement Command Pattern in C#: Step-by-Step Guide
Nick Cosentino
En .NET, todos hemos usado string.Format() 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.
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.
En este artículo exploraremos cómo mejorar el rendimiento de string.Format() utilizando la clase CompositeFormat en .NET, que nos permite evitar el coste de analizar la cadena de formato cada vez que se llama al método.
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.
Pero como siempre, destacaremos unos cuantos.
José Manuel Alarcón nos habla de que el uso de la IA sin un control adecuado podría introducir deuda técnica en nuestros proyectos, y nos ofrece una guía para evitarla.
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 diferencias entre agentes, skills y comandos en el contexto de herramientas como Claude Code, Codex, Copilot CLI y Gemini CLI.
Fernando Escolar nos recuerda la importancia de mejorar continuamente nuestro código con pequeños cambios, que, aunque no sean espectaculares, pueden marcar una gran diferencia en la calidad y mantenibilidad de nuestro software.
Gerson Azabache nos habla de "workers" o tareas en segundo plano 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 cómo implementarlos en .NET con IHostedService.
Y para terminar, todo un clásico: ¿quieres mostrar una dirección de correo electrónico en tu sitio web sin que los spammers se ceben con ella? Spencer Mortensen nos cuenta las técnicas de ofuscación de correo electrónico que siguen funcionando en 2026.
El resto de contenidos interesantes, a continuación.
Por si te lo perdiste...
- Cómo detectar y reaccionar a cambios en settings de ASP.NET Core, en tiempo real
José M. Aguilar - Ámbito local implícito en sentencias using de C#
José M. Aguilar
.NET
- Tu App Necesita Workers Silenciosos: El Patrón que Usa Amazon para No Hacerte Esperar & * Background Jobs en .NET con IHostedService: Procesa Tareas en Segundo Plano
Gerson Azabache Martínez - Using LLMs and MCP in .NET
Ricardo Peres - Configuring contextual options with Microsoft.Extensions.Options.Contextual
Andrew Lock - How .NET handles exceptions internally (and why they're expensive)
Ali Hamza Ansari - URL Pattern Matching in .NET
Gérald Barré - How to build .NET obfuscator
Andrii Kurdiumov - Explore union types in C# 15
Bill Wagner - Convert Anything to Markdown in .NET — Meet ElBruno.MarkItDotNet
Bruno Capuano - Source code generated string enums with exhaustion support
Steven Giesel - What’s New in .NET 11 Preview 1 & 2: Runtime Async, Zstandard, Blazor TempData, and Vector Search
Arulraj Aboorvasamy - Libraries I Stopped Using in .NET (And I Don’t Regret It)
Miguel Teherán - 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)
Anthony Giretti - Testing C# Source Generators: A Practical Guide
Nick Cosentino

