
Aquí tenemos la entrega número 607 de la recopilación semanal de contenidos interesantes 🙂
Esta semana podemos destacar un extenso artículo de Milan Milanović, donde nos explica por qué C# es el mejor lenguaje de programación: sus características, ventajas, historia, futuro, comparación con otros lenguajes, y mucho más.
También me ha llamado la atención CSS Hell, un conjunto de puzzles donde tendrás que exprimir tus conocimientos de CSS para conseguir los objetivos que te plantean 👉 https://csshell.com/
Finalmente, Juan Luis Guerrero nos muestra cómo combinar distintas tecnologías como Semantic Kernel, Phi-3 y Qdrant para construir una API RAG.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Cómo conseguir que los parámetros de un constructor primario de C# sean de sólo lectura
José M. Aguilar - Retorno de referencias y referencias locales en C#
José M. Aguilar
.NET
- Going beyond singleton, scoped, and transient lifetimes—tenant, pooled, and drifter
Andrew Lock - Semantic Search PDF Files Locally using .NET / C# and Build5Nines.SharpVector
Chris Pietschmann - Extensions get an update in .NET 10
Steven Giesel - Discover C# 13 new features
Tom Deseyn - Mastering xUnit v3: Mocking Static Methods in .NET
Eli Lopian - What are record types in C# / .NET?
Carmel Eve - Slices and Strings with Rust: Goodbye C# StringBuilder?
Chris Woodruff - Why C#?
Milan Milanović
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces

Ha sido una semana especial con tanto festivo, pero aún así he conseguido recopilar contenidos que espero que os resulten interesantes, sobre .NET, ASP.NET Core, IA, programación web y muchos otros temas.
En esta ocasión ponemos el foco en la carrera de las tecnológicas lanzando modelos de IA generativa. Aunque esta locura está haciendo que deje de sorprendernos cada lanzamiento, está bien saber que esta semana OpenAI ha presentado tres nuevos modelos: GPT 4.1, o3 y o4-mini.
Vale la pena echar también un vistazo a las mejoras de Copilot en el recientemente lanzado Visual Studio 17.14 Preview 3: autocompletado de código, chat, nuevos modelos, inferencia de próximas ediciones o pegado inteligente son algunas de las novedades.
E interesante el detallado paso a paso de Juan Luis Guerrero sobre cómo crear una extensión de Copilot para Visual Studio Code usando MCP para conectarlo con una herramienta personalizada creada con .NET.
El resto, a continuación.
Por si te lo perdiste...
- Constructores primarios en C# 12
José M. Aguilar - Literales binarios y separador de dígitos numéricos en C#
José M. Aguilar
.NET
- Who can cancel Carmen Sandiego?
Oren Eini - Building a Modular Monolith With Vertical Slice Architecture in .NET
Anton Martyniuk - Choosing a framework to build a native app on Windows with .NET
Matt Lacey - Why .NET Unit Testing Still Feels Hard (and How to Fix It in 2025)
Eli Lopian - Handle cancellation in tests with xUnit.net v3
Anthony Simmon - Structured logging in .NET with NativeAOT
Alexandre HTRB - AutoMapper and MediatR Licensing Update
Jimmy Bogard - Handling exceptions for Task.WhenAll
Fati Iseni - Introducing Incrementalist, an Incremental .NET Build Tool for Large Solutions
Aaron Stannard - Semantic Search in .NET / C# with Build5Nines.SharpVector
Chris Pietschmann - The Strong ARM of .NET: Wrestling with x64 and Arm64 Desktop App Deployment
Rick Strahl

En la entrega número 605 de nuevo superamos los sesenta enlaces a contenidos interesantes recopilados durante la semana pasada, abarcando temas de .NET, ASP.NET Core, Azure, CSS, JavaScript, IA y muchos otros.
Destacar, antes de nada, que con esta entrada superamos oficialmente los quince años desde que comenzamos a recopilar y publicar enlaces interesantes, el 11 de abril de 2010. Hace poco ya celebramos la entrega 600, así que no os daré la turra con esto; simplemente, a estas alturas es curioso revisar aquél post inicial "Enlaces interesantes 1", con formato raro, imágenes rotas, personas que ya no están en primera línea, blogs que no existen, herramientas obsoletas... en fin, el paso del tiempo 😉
Cinco años más (o sea, 20) cumple Git, y Taylor Blau lo celebra con una entrevista al mismísimo Linus Torvalds, el creador de esta herramienta, hoy imprescindible en el día a día de cualquier desarrollador-
Y continuando con el número veinte: algo más de veinte días han pasado desde que se lanzó la segunda versión preliminar, y ya tenemos la Preview 3 de .NET 10, con mejoras en bibliotecas, runtime, SDK, MAUI, C#, ASP.NET Core, Blazor y Entity Framework, entre otros. ¡Vaya ritmo que llevan!
Por último, os recomiendo echar un vistazo al post de Benjamin Dicken sobre la latencia en dispositivos de almacenamiento habituales: su historia, cómo funcionan y el rendimiento que ofrecen. Pero aparte de la información, lo que más me ha gustado es la forma de presentarla.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Personalizar los mensajes de error de parseado en formularios Blazor
José M. Aguilar - Deconstrucción de tuplas y clases en C# 7
José M. Aguilar
.NET
- .NET 10 Preview 3 is now available!
.NET Team - Dragging your whole database into memory!
Steven Giesel - How to monitor .NET applications startup
Christophe Nasarre - Kafka and .NET: Practical Guide to Building Event-Driven Services
Hamed Salameh - Announcing CommandLineExtensions, a .NET DI Compatible System.CommandLine Facade
Peter Ritchie - How we ended up rewriting NuGet Restore in .NET 9
NuGet Team - Optimizing JSON in .NET: Newtonsoft.Json vs System.Text.Json
Ali Hamza Ansari - Boost Your .NET Projects: Retry Logic Made Easy with Spargine’s ExecutionHelper
David McCarter - Build a Token Visualizer in Dotnet
Ed Charbeneau

En C#, existen atributos que no están diseñados para añadir metadatos consumibles en tiempo de ejecución, sino que están pensados para ser interpretados por el compilador.
Entre ellos, se encuentran los atributos englobados en la categoría "caller information", que ofrecen la posibilidad de que un método o función conozca información sobre el método que lo ha llamado, como el nombre del archivo, el número de línea, el nombre del método o la expresión de argumento.
Esto puede ser muy interesante en diversos escenarios, pero probablemente el ejemplo más claro lo encontramos en la generación de trazas y puntos de control, puesto que, en lugar de tener que escribir manualmente el nombre del método o el número de línea, podemos obtenerlos de forma automática.
Lo vemos a continuación.

Una semana más, vamos con una recopilación de contenidos interesantes que he ido descubriendo durante los últimos días. De nuevo, más de 60 enlaces a artículos sobre .NET, C#, Azure, ASP.NET, Blazor, Machine Learning, IA, JavaScript, HTML, CSS y mucho más. Espero que os resulten útiles.
En esta entrega hay bastantes temas reseñables, pero me voy a quedar sólo con unos cuantos 🙂
Para celebrar el 50 aniversario de Microsoft, Bill Gates nos cuenta los inicios de la compañía y comparte el código de Altair Basic, su primer producto. Aparte del contenido, es un post con una estética retro fantástica que bien merece un vistazo.
Un nuevo terremoto, con epicentro en los conocidos Automapper y MediatR, que de nuevo traen a la palestra el problema de la sostenibilidad de los proyectos open source y, obviamente, con reacciones de todo tipo al respecto.
José Manuel Alarcón nos muestra Docker Model Runner, una herramienta que permite ejecutar localmente modelos generativos de IA de forma muy sencilla, y acceder a ellos desde línea de comandos o mediante una API compatible con OpenAI.
En el apartado de historias truculentas, descubrimos un post de Jacob Voytko publicado hace unas semanas, donde describe su lucha contra el bug más difícil al que se ha enfrentado mientras trabajaba en el equipo de Google Docs. Muy interesante-
También traemos una buena noticia para los frontenders: por fin podemos personalizar visualmente el elemento <select>
con CSS. En este artículo de Adam Argyle nos cuenta cómo hacerlo y hasta dónde podemos llegar con esta nueva posibilidad-
Y por último... ¡boom! Meta presenta y pone a disposición de la comunidad varias ediciones de Llama 4, modelos abiertos multimodales con hasta 10 millones de tokens de contexto, velocidad y rendimiento de primera línea. Y próximamente habrá más, y más potentes.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Personalizar los mensajes de error de parseado en formularios Blazor
José M. Aguilar - Deconstrucción de tuplas y clases en C# 7
José M. Aguilar
.NET
- C# Language Mind map v14
Steven Giesel - Records and Collections
Jon Skeet - Finalizers are tricker than you might think. Part 2
Sergey Teplyakov - Modernizing push notification API for Teams
Rudolf Kurka - AutoMapper and MediatR Going Commercial
Jimmy Bogard - Is the .NET Ecosystem in Crisis?
Matt Goldman - .NET on Heroku: Now Generally Available
Rune Soerensen - What's New in C# 14? Key Features and Updates You Need to Know
Vinoth Kumar Sundara Moorthy - Converting between .Net DateTime and JavaScript Date Ticks
Joel Ivory Johnson

Cuando hablamos de comparar números enteros, está claro que 1 es menor que 2, y éste menor que 10:
1 < 2 < 10
Sin embargo, si estos valores están en una cadena de texto, la comparación se hace carácter a carácter, y en ese caso "10" es menor que "2":
"1" < "10" < "2"
Este criterio de ordenación puede ser molesto en muchos escenarios, sobre todo cuando queremos ordenar o comparar valores numéricos se encuentran en el interior de cadenas de texto donde hay otros contenidos. En todos estos casos, la comparación lexicográfica tradicional no nos dará los resultados esperados:
- Una lista de nombres de archivo como "file1.txt", "file2.txt"... así hasta "file10.txt". Al ordenarlos, "file10.txt" aparecerá antes que "file2.txt".
- Versiones de un software, como "1.2" y "1.10". Si las comparamos, la versión "1.10" será anterior a la "1.2", cuando en realidad es al revés.
- De la misma forma, una lista de direcciones IP, como "10.10.2.10", "10.10.10.10", si queremos mostrarlas de forma ordenada, obtendremos "10.10.10.10" y "10.10.2.10", que no es su orden numérico real.
- O simplemente, si comparamos las horas "01:10" con "1:10", la primera será anterior a la segunda, cuando en realidad se trata de la misma hora.
Hasta la versión 10 de .NET no existía una forma sencilla de resolver estos casos, por lo que teníamos que implementar soluciones propias, bastante farragosas en algunos casos, o bien utilizar bibliotecas de terceros. Sin embargo, en .NET 10 se ha añadido una forma nativa para conseguirlo, que vemos a continuación.

La recopilación de enlaces número 603 está ya disponible, con más de 60 links a contenidos sobre .NET, C#, ASP.NET, Azure, Machine Learning, Web, HTML, CSS, JavaScript y otros temas que, como siempre, espero que os resulten interesantes 🙂
Si desarrolláis páginas con muchos elementos en el DOM, os puede venir bien echar un vistazo a content-visibility
, una propiedad CSS que nos puede ayudar a mejorar el rendimiento de páginas web al omitir la renderización de elementos que no son visibles en la pantalla 👉 https://cekrem.github.io/posts/content-visibility-auto-performance/
Continuando en el mundo web, pero esta vez desde la perspectiva de la seguridad, tenemos un gran repaso de Maarten Balliauw al sistema de tokens antiforgery en ASP.NET Core. En este post, veremos qué es CSRF y cómo estos tokens pueden ayudarnos a prevenirlo cuando utilizamos MVC, Razor Pages o Minimal APIs.
También me ha parecido curioso el post de Mohammad Zeya Ahmad sobre tiempos de latencia de distintas operaciones frecuentes. Está bien para tener en mente al menos las proporciones y magnitudes que manejamos en cada caso.
Y por último, echamos un vistazo al protocolo de moda: MCP. Se trata de un protocolo abierto, creado por Anthropic, que propone mecanismos de integración entre aplicaciones basadas en modelos de texto y fuentes de datos o herramientas. Muy interesante.
El resto, a continuación...
Por si te lo perdiste...
- Collection expressions, la nueva sintaxis de inicialización de colecciones en C# 12
José M. Aguilar - Expresiones throw en C# 7
José M. Aguilar
.NET
- A Simple State Machine in .NET
Ricardo Peres - Using Windows.Media SpeechRecognition in WPF
Rick Strahl - Optimizing concurrent count operations
Oren Eini - C# Tip: An In-Depth Look at CallerMemberName (and some Compile-Time trivia)
Davide Bellone - Retrieving Services from Dependency Injection in .NET
Ricardo Peres

En JavaScript es frecuente encontrar expresiones como esta para comprobar si un objeto tiene valor (o, al menos, si su valor es uno de los reconocidos como truthy
):
const friend = getFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend) {
// Hacer algo con el objeto friend
}
Debido a su sistema de tipos estricto, en C# no es posible hacer lo mismo de forma directa, tenemos que comprobar si el objeto es null
, por ejemplo así:
var friend = GetFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend is not null) {
// Hacer algo con el objeto friend
}
Sin embargo, con muy poco esfuerzo podemos hacer que C# acepte la sintaxis de JavaScript para ese tipo de chequeos de nulidad, implementando en nuestra clase un conversor implícito a bool
. Lo vemos a continuación.

Otra semana más, aquí tenemos los enlaces recopilados durante los últimos siete días que, como de costumbre, espero que os resulten interesantes 🙂
En esta ocasión, nos llevamos la sorpresa de la aparición de la segunda preview de .NET 10, apenas veinte días después de publicarse la primera. ¿Se han adelantado? ¿O es que se retrasaron con la primera y al final se han agolpado? 🤔 Bueno, la cuestión es que aquí la tenemos, con novedades en el SDK, C#, runtime y los frameworks asociados (ASP.NET Core, MAUI, Entity Framework, Windows Forms, etc.)
Por otro lado, ¿qué es eso del vibe coding? Sin duda es muy espectacular, pero, ¿nos va a quitar el trabajo a todos? ¿Pondrá la programación al alcance de cualquiera? El artículo de Jacob Anderson lo explica.
También podemos leer a Mark Seemann hablando sobre versionado de bases de código y estrategias para la gestión de breaking changes en proyectos de largo recorrido. Muy interesante.
El resto de enlaces, unos sesenta, los tenéis a continuación.
Por si te lo perdiste...
- Cómo aplicar atributos a propiedades de un record en C#
José M. Aguilar - Tuplas en C#
José M. Aguilar
.NET
- .NET 10 Preview 2 is now available!
Marcelo Oliveira Santos - Create a Task and Start it Later
Bryan Hogan - .NET Metrics
Ricardo Peres - MSTest 3.8: Top 10 features to supercharge your .NET tests!
Youssef Fahmy & Amaury Levé - Metadata Consulting [dot] ca: C# Round Datetime Extension To Nearest Minute, Round Up, Round Down
Metadata Consulting - Putting Tasks in a Cache, and Computing Only Once, When First Requested
Bryan Hogan

En nuestras aplicaciones, es relativamente frecuente tener que buscar una serie de valores dentro de un conjunto de datos. Existen muchos escenarios, como cuando tenemos que buscar una serie de palabras dentro de un texto largo, o comprobar si todos los caracteres de un string
pertenecen a un conjunto de caracteres válidos.
Por ejemplo, centrándonos en este último caso, imaginad que queremos comprobar si el contenido de una cadena de texto de tamaño arbitrario contiene únicamente una serie de caracteres válidos (por ejemplo, las vocales). La implementación que se nos ocurriría de forma natural sería muy simple: recorrer la cadena de texto de entrada, y, por cada carácter, comprobar si está en el conjunto de caracteres permitidos. ¿Fácil, no?
Sin embargo, como veremos en este post, hay formas mucho más eficientes de hacerlo.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: .net, .net8, .net9, optimización, rendimiento, trucos

Ya tenemos por aquí la recopilación de enlaces de la semana, en esta ocasión con más de 50 enlaces, aunque especialmente cargadas las secciones de .NET y desarrollo web.
Destacable el artículo de Derek Comartin sobre el principio YAGNI (You Aren't Gonna Need It, "No vas a necesitarlo") en el desarrollo de software, y cómo la tentación de añadir abstracciones o código genérico puede llevarnos a un exceso de complejidad que no aporta valor al proyecto.
También, Ricardo Peres continúa su interesante exploración sobre los puntos de extensibilidad de ASP.NET Core, centrándose en esta ocasión en el framework MVC.
El último dramita en la comunidad .NET lo protagoniza el compilador de TypeScript, que ha sido portado a Go y ha multiplicado por diez su rendimiento. Anders Hejlsberg nos lo cuenta de primera mano en este artículo, y podéis seguir el culebrón en este hilo de GitHub.
Y para finalizar con comentario rápido, sabed que HybridCache ya ha salido de preview. Claudia Regio nos resume las novedades de esta herramienta.
El resto de enlaces, a continuación 🙂
Por si te lo perdiste...
- Blazor Server-Side Rendering en .NET 8
José M. Aguilar - Inline out variables en C# 7
José M. Aguilar
.NET
- Hello HybridCache! Streamlining Cache Management for ASP.NET Core Applications
Claudia Regio - New, Simpler Solution File Format
Nayana Srikanth - System.Linq.Async is part of .NET 10
Steven Giesel - Top 15 Mistakes .NET Developers Make: How to Avoid Common Pitfalls
Anton Martyniuk - Writing a .NET Garbage Collector in C#
Kevin Gosse - Microsoft .NET Code Analysis: When CountAsync() Outperforms AnyAsync() in .NET
David McCarter - Ardalis Specification v9 Released
Steve Smith - Accessing Windows Settings Dialogs from Code via Shell Commands
Rick Strahl - .NET Heisenbug Mystery Theater: How Did an Exception Escape its Catch Block?
Aaron Stannard - .NET Interview Questions and Answers (With Code Examples)
Claudio Bernasconi

Quizás sea el único del mundo que desconocía la existencia de "Tech on the toilet", la iniciativa de Google que lleva casi veinte años llevando información de calidad a los aseos de sus oficinas para que los desarrolladores, mientras hacen sus necesidades, puedan mejorar sus habilidades de desarrollo de software.
Pero como seguro que habrá algún despistado más, me ha parecido interesante compartirlo por aquí, así que vamos allá 🙂

Esta semana llegamos a la entrega número 600 de los enlaces interesantes, ¡quién lo iba a decir cuando publiqué la primera recopilación, allá por abril de 2010! Desde entonces, exceptuando los periodos vacacionales y alguna semana que por motivos personales o profesionales no haya podido ser, cada día dedico un buen rato a revisar mis fuentes y seleccionar los contenidos que me parecen más interesantes para compartirlos con vosotros. Luego, normalmente los domingos, me siento a escribir la entrada, añadiendo una pequeña introducción y organizando los enlaces por categorías para facilitar su consulta.
Por cuantificarlo de alguna forma, cada recopilación suele tener entre 60 y 70 links, así que he compartido como mínimo 36.000 enlaces a contenidos que he considerado valiosos, y, haciendo cuentas rápidas, he debido dedicar más de 3.000 horas (unos 375 días a jornada completa) a revisarlos y seleccionarlos. Si tenéis curiosidad por cómo lo hago, los criterios de selección de contenidos, cómo los ordeno, cuáles son mis fuentes, qué herramientas uso, etc., lo podéis leer en este post de hace unos años 👉 https://www.variablenotfound.com/2020/04/diez-anos-de-enlaces-interesantes-lo.html
Pero bueno, creo que el esfuerzo está justificado. En primer lugar, porque me gusta estar al día, y creo que en nuestra profesión es totalmente necesario. Y luego, porque ya que de todas formas estoy dedicando tiempo a ello, ¿por qué no compartirlo con vosotros? Y si a alguien le resulta útil, o le ahorra tiempo, o le descubre algo nuevo, pues ya me doy por satisfecho 🙂
¡Muchas gracias a todos por estar ahí!
Y dicho esto, vamos con la recopilación semanal, de nuevo más de sesenta enlaces, en esta ocasión con mucha presencia de contenidos sobre inteligencia artificial, novedades en herramientas, .NET, MAUI, Azure y Web.
En esta cosecha, muy interesante, y de agradecer, el esfuerzo de José Manuel Alarcón por traducir a un idioma que podamos entender los mortales lo que es Majorana 1 y cómo promete revolucionar el mundo en los próximos años.
También me ha alegrado volver a leer a Marc Rubiño, comentando esta vez el papel de los CTO en las startups, los desafíos a los que se enfrentan y buenas prácticas para lograr el éxito en ese rol.
Juan Irigoyen da un buen repaso a los niveles de aislamiento de transacciones en SQL Server, un tema que siempre es interesante y que conviene tener claro, especialmente en aplicaciones con alta concurrencia.
Y por último, interesante también el post de Sahil Malik donde muestra cómo generar imágenes con IA usando modelos locales.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- 8 formas de usar tuplas en C#
José M. Aguilar - Tip: desinstalar rápidamente paquetes NuGet en proyectos .NET Core
José M. Aguilar
.NET
- .NET 10: Game-Changer or Just Another Version?
DeeDee Walsh - Abusing await with a result type to achieve rust-like error propagation in C# -
Arkleseizure - Creating an analyzer to detect infinite loops caused by ThreadAbortExceptions
Andrew Lock - How to Perform Dynamic Code Execution in .NET with C# Eval Expression
Anton Martyniuk - Generic C# Methods with Enum Constraints for .NET
Khalid Abuhakmeh - Using legacy text encodings in .NET Core
Bart Wullems - Capture .NET Profiler Trace on the Azure App Service platform
Csharpguitar - Disable NuGet Central Package Management for specific projects
Bart Wullems - Co/Contravariance in C# Interfaces
Ian Griffiths - C# - Set environment in unit tests
Bart Wullems

Normalmente los servicios usados por nuestra aplicación ASP.NET Core los registraremos en el contenedor de dependencias, para luego ir satisfaciendo los requisitos de los distintos componentes gracias a los mecanismos de inyección de dependencias que nos proporciona el framework. De estos servicios, aquellos que se registran como scoped se liberarán automáticamente al finalizar el proceso de la petición.
Sin embargo, si instanciamos manualmente un servicio durante el proceso de la petición, tendremos que encargarnos nosotros mismos de liberarlo cuando ya no sea necesario. Los que tengan un ámbito de vida corto, normalmente los crearemos y destruiremos utilizando using
en algunos de sus sabores (como bloque o con ámbito local implícito), pero cuando queremos que pueda ser compartido entre varios componentes, no es sería tan sencillo... si no fuera porque el framework ya lo ha tenido en cuenta 🙂
Para estos casos, ASP.NET Core proporciona el extensor RegisterForDispose()
, que nos permite registrar un servicio para que se libere automáticamente al finalizar la petición.

Aquí van los enlaces recopilados en la última semana de febrero, una buena colección que espero que os resulte de utilidad.
En esta ocasión, además de contenidos interesantes sobre C#, ASP.NET, Visual Studio, JavaScript, CSS, IA y otros temas, creo que la cosa ha ido de previews:
- La presentación de .NET 10 Preview 1
- La salida de preview del formato simplificado para soluciones .NET, ".SLNX"
- La presentación de GitHub Copilot agent mode (preview)
- La presentación de la preview de GPT-4.5
También me ha parecido muy completo el artículo de Joseph Thacker sobre cómo hackear aplicaciones y agentes basados en Modelos de Lenguaje.
Por último, en el capítulo de despedidas de clásicos, vamos a empezar a decirle adiós a Skype, una herramienta que, aunque en agónico declive desde hace ya tiempo, sin duda marcó una época.
El resto de contenidos, a continuación 🙂
Por si te lo perdiste...
- Formatear cadenas interpoladas en C#
José M. Aguilar - Funciones locales en C# 7
José M. Aguilar
.NET
- .NET 10 Preview 1 is now available!
.NET Team - SLNX Finally here
Mattias Karlsson - Building a Better MediatR Publisher With Channels (and why you shouldn't)
Milan Jovanović - C# 14: Null-conditional assignment
Steven Giesel - Disabling localized satellite assemblies during dotnet publish
Andrew Lock - How To Implement Caching Strategies in .NET
Anton Martyniuk - Using PostHog in your .NET applications
Phil Haack - Fixing out of sequence timestamps
Colin Mackay - How to Parse and Extract HL7 Data in C# .NET
Greg Lutz - Doing Some Cleanup in a BackgroundService
Bryan Hogan - Measure Application Performance in .NET Using IMeterFactory
Muhammed Saleem - Microsoft .NET Code Analysis: Optimizing JSON Serialization with Cached Options
David McCarter - C# 14 - New Features and Updates
Vijay Kumari - Measuring the Performance of JSON Alternatives in .NET
Ricardo Peres

Si lleváis algunos años en esto, seguro recordaréis que en ASP.NET "clásico", los settings de las aplicaciones eran valores inmutables. Se guardaban habitualmente en el célebre archivo Web.config
, y cualquier cambio a este archivo implicaba reiniciar la aplicación para que los cambios tuvieran efecto.
En ASP.NET Core, los settings son mucho más flexibles: se pueden cargar desde diferentes orígenes, pueden almacenarse en distintos formatos, y es posible modificarlos en caliente sin necesidad de reiniciar la aplicación. Pero además, ofrecen otra capacidad que es interesante conocer: podemos detectar y reaccionar a cambios en los settings en tiempo real, es decir, en el mismo momento en que se producen.
Para ello, básicamente tendremos que bindear una clase personalizada a la sección de settings que nos interese, y luego utilizar la interfaz IOptionsMonitor
, para registrar un manejador personalizado que se ejecute cada vez que se produzca un cambio en los valores de configuración que estamos monitorizando.
En este post vamos a ver cómo hacerlo, paso a paso.

Un lunes más, ya tenemos aquí la colección de enlaces a contenidos interesantes recopilados durante la semana pasada. Como de costumbre, encontramos lecturas sobre .NET, ASP.NET Core, Blazor, IA, datos, frontend, JavaScript, TypeScript, MAUI y otros temas que espero os aporten algo 🙂
En esta ocasión, me gustaría destacar algunos de los artículos de la semana que más me han llamado la atención.
Primero, una nueva demostración de la velocidad brutal con la que se van produciendo avances tecnológicos de escala: la presentación por parte de Microsoft de Majorana 1, el nuevo chip que, según anuncian, adelantará el uso real de computación cuántica a unos años, en lugar de las décadas que estaban previstas.
También me ha resultado interesante el post sobre cómo SoundCloud evolucionó su su arquitectura utilizando BFF, microservicios y DDD. Estos contenidos basados en experiencias reales suelen ser bastante inspiradores.
Toda seguridad es poca, por lo que siempre es recomendable volver a echar un vistazo a las guías OWASP sobre cómo asegurar nuestras aplicaciones web full-stack.
Por último, es impresionante leer las mejoras que se van introduciendo en Visual Studio, especialmente las que hacen que el IDE sea cada vez más inteligente y, por tanto, nosotros seamos cada vez más productivos. En esta entrega, encontramos el soporte para tool calling en Copilot, y la información sobre el código usado como referencia para los autocompletados.
El resto, a continuación...
Por si te lo perdiste...
- Cambiar el nombre de la carpeta raíz de las páginas en Razor Pages
José M. Aguilar - Adivina, adivinanza: ¿por qué no compila este código?
José M. Aguilar
.NET
- IEnumerable vs IEnumerator in C#: One is 2x Faster
Steven Giesel - Understanding Garbage Collection - How the dotnet Garbage Collector Works
Darren Horrocks - The Curious Case of .NET ConcurrentDictionary and Closures
Khalid Abuhakmeh - How to Convert Word to PDF in C# with Advanced Formatting Options
Mohanaselvam Jothi - Leveraging Tuples in C#: Real-World Use Cases
Ali Hamza Ansari - Writing a .NET Garbage Collector in C#
Kevin Gosse - Killing a Worker Application from a BackgroundService
Bryan Hogan - Microsoft .NET Code Analysis: Optimizing Byte-to-Hex Conversions
David McCarter - Retrieving Images from the Clipboard Reliably in WPF Revisited
Rick Strahl

Imaginad que tenemos un objeto clase Coche
y otro del tipo PatitoDeGoma
, sin ningún tipo de relación entre ellos. C# no permite hacer un cast y convertir libremente de uno a otro tipo o viceversa, ¿verdad?
Pues eso pensaba yo también, hasta que hace poco descubrí una característica de .NET que no he usado nunca y dudo que vaya a usar 😝, pero me ha parecido de lo más curiosa y quería compartirla con vosotros. Como podréis comprobar, es una buena candidata para la serie C# bizarro, de la que ya llevamos varias entregas, aunque en realidad se trata de una característica de la plataforma y no del lenguaje.
La protagonista es la clase estática System.Runtime.CompilerServices.Unsafe
, que, según indican en la documentación oficial, implementa funcionalidades de bajo nivel para manipular punteros gestionados y no gestionados. Su objetivo, según esta misma fuente, es permitir a desarrolladores de bibliotecas escribir código de alto rendimiento evitando los chequeos de seguridad de .NET.
Esta clase proporciona métodos de aritmética de punteros, conversión de tipos y otras operaciones que no son seguras en C# y que, por tanto, no se permiten salvo en contextos unsafe
. Sin embargo, en ocasiones, puede ser útil para realizar operaciones que no son seguras pero que sabemos que no van a causar problemas en tiempo de ejecución.
El que más me ha llamado la atención ha sido el método As()
, que permite forzar un cast entre dos tipos que a priori no son compatibles sin realizar comprobaciones de tipo en tiempo de ejecución.

Aquí tenemos la colección semanal de enlaces a contenidos interesantes relacionados con el desarrollo de software con C#, ASPNET, Blazor, JavaScript, CSS, Azure, AI, .NET MAUI, Visual Studio y otros.
Por destacar, esta semana encontramos un interesante post de Ricardo Peres donde nos cuenta qué eso de OpenTelemetry, cómo enviar datos de telemetría desde aplicaciones ASP.NET Core, y cómo recopilarlos y consultarlos usando herramientas como Grafana, Loki, Tempo y Prometheus a través de una imagen de Docker. Imperdible.
También me ha parecido curioso Gandalf, el juego al que llego a través del post de Bart Wullems, que nos permite comprobar nuestras habilidades para manipular un LLM usando inyección de prompts. Sin duda, da para un buen rato de maldad y diversión 😉
El resto, a continuación. ¡Espero que os resulten interesantes!
Por si te lo perdiste...
- ¿Acceder a miembros privados de una clase C# sin usar reflection? ¡En .NET 8 es posible!
José M. Aguilar - Flushing asíncrono en ASP.NET Core MVC
José M. Aguilar
.NET
- Microsoft.Testing.Platform: Now Supported by All Major .NET Test Frameworks
Amaury Levé - Using .NET on Linux
Bryan Hogan - Unlocking delegate's potential in C#
Ali Hamza Ansari - Writing a .NET Garbage Collector in C#, part 3
Kevin Gosse - Why Large JSON Objects Are Slowing Down Your .NET Application (And How to Fix It)
Hossein Kohzadi - C# Dictionary: How to Create One and Best Practices
Stackify Team - Exploring the .NET Ecosystem: A Visual Mind Map
Abhijit Jana

Desde que se introdujo en Visual Studio el soporte para archivos .http
, he estado usando esta funcionalidad del IDE para probar APIs, dejando casi totalmente de lado a herramientas que había utilizado siempre como Postman o Fiddler. Es genial tenerlo todo en el mismo entorno, que sea tan sencillo de utilizar, y que se integre tan bien con otras herramientas del ecosistema, como el endpoint explorer, user secrets de ASP.NET Core, Azure key vault, etc.
Sin embargo, una limitación importante era que sólo podíamos declarar y asignar variables, pero éstas no podían ser modificadas en tiempo de ejecución. Esto hacía que, por ejemplo, no pudiéramos hacer una llamada a un endpoint de autenticación y utilizar luego el token retornado para acceder a determinados recursos, por lo que teníamos que hacerlo manualmente.
Pero esto cambió con la versión 17.12 de Visual Studio 2022, donde se ha añadido la posibilidad de poder capturar valores de la respuesta de una petición para utilizarlos más adelante en otras peticiones.

Ya está disponible la entrega semanal número 596 de la serie, donde, como de costumbre, podéis encontrar decenas de links a contenidos que he ido recopilando durante la semana y considero interesantes sobre .NET, ASP.NET Core, Blazor, acceso a datos, inteligencia artificial, programación en frontend, herramientas y otros temas.
En esta ocasión, lo que me más ha llamado la atención es la retirada de Azure Data Studio. Ahora que estaba empezando a tenerle cariño a esta herramienta para gestionar mis bases de datos SQL Server, resulta que la van a discontinuar en favor de la extensión MSSQL extension de Visual Studio Code.
¿Sabíais que la media de tiempo que se tarda en volver a concentrarse en una tarea después de una interrupción es de 23 minutos? Muy interesante el artículo de Milan Milanović sobre cómo los cambios de contexto, o context switching, afectan a la productividad de los desarrolladores. Aunque cualquiera que se dedique al desarrollo ya lo ha sentido en sus carnes, es interesante leer un análisis más profundo sobre el tema.
Vale la pena echar también el vistazo a las reflexiones de Tim O'Reilly sobre cómo afectará la irrupción de la IA en el trabajo de los desarrolladores. ¿Iremos todos a la calle? ¿O, por el contrario, se abrirán nuevas oportunidades? Spoiler: la clave es adaptarse.
El resto de enlaces, a continuación...
Por si te lo perdiste...
- TimeProvider: el proveedor de tiempos de .NET 8
José M. Aguilar - Acceder a IIS Express desde otro equipo de la red local
José M. Aguilar
.NET
- Why Tracebit is written in C#
Sam Cox - Modelling data relationships with C# types
Mark Seemann - Timers, Finalizers and Memory Leaks
Sergey Teplyakov - Supporting multiple .NET SDK versions in a source generator
Andrew Lock - Vogen and Value Objects with C# and .NET
Khalid Abuhakmeh - Writing a .NET Garbage Collector in C#
Kevin Gosse - Migrate from MSTest to xUnit using a Roslyn analyzer
Gérald Barré - Numeric sorting in .NET
Anthony Simmon - How to Protect Word Documents in C#: Step-by-Step Guide
Mohanaselvam Jothi - .NET 9 Networking Improvements
Máňa & Natalia Kondratyeva & Anton Firszov - LINQ MindMap: .NET 10 Edition
Steven Giesel

Como sabemos, es muy sencillo implementar servicios en segundo plano alojados en el interior de aplicaciones ASP.NET Core porque el framework nos proporciona infraestructura que simplifica la tarea, permitiendo que nos enfoquemos en la lógica de negocio que queremos ejecutar en background en lugar de tener que preocuparnos de los aspectos de más bajo nivel necesarios para hacer que funcione.
En la práctica, basta con heredar de la clase BackgroundService
y sobreescribir el método ExecuteAsync
para implementar la lógica que queremos ejecutar en segundo plano. Por ejemplo, el siguiente servicio se encarga de escribir un mensaje en la consola cada segundo:
public class MyBackgroundService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Console.WriteLine($"Current time: {DateTime.Now:T}");
await Task.Delay(1000, stoppingToken);
}
}
}
Luego tendríamos registrar este servicio en el contenedor de dependencias de ASP.NET Core, de forma que el framework lo detectará automáticamente y lo lanzará cuando la aplicación sea iniciada:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHostedService<MyBackgroundService>();
...
Al ejecutar, veremos que, en la consola donde hemos lanzado la aplicación, se escribirá periódicamente la hora desde la tarea en segundo plano:
Current time: 13:34:06
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7080
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5148
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: D:\Projects\BackgroundServiceCrash
Current time: 13:34:07
Current time: 13:34:08
Pero bueno, no es esto de lo que quería hablar, sino de lo que ocurre cuando en uno de estos servicios en segundo plano se produce un error... porque ojo, que si no tenemos cuidado puede tumbar completamente nuestra aplicación.

Estrenamos febrero con la recopilación número 595 de enlaces interesantes, cargado de contenidos variados y de calidad relacionado con el desarrollo de software: .NET, ASP.NET, Azure, conceptos, patrones y buenas prácticas, IA, programación web (HTML, CSS, Javascript, frameworks), Visual Studio y herramientas, .NET MAUI, y otros.
Sin duda, la sorpresa y gran protagonista de la semana ha sido el lanzamiento de DeepSeek R1, la IA open source que ha puesto patas arriba a los que hasta ahora se consideraban los reyes del mambo, demostrando que China compite en primera división de los modelos generativos.
También es interesante echar un vistazo bajo el capó de los navegadores, a los mecanismos encargados de interpretar los para interpretar el código HTML y CSS que les llega y crear su representación visual. Aditya Bhattacharya nos lo cuenta el artículo HTML & CSS Deep Dive Part 1: How Browsers Make Sense of Your Code.
Sergey Teplyakov nos recuerda en el post The Dangers of Async Void lo peligroso que puede ser crear métodos o funciones async void
en C#, una práctica que puede llegar a tumbar por completo una aplicación.
El amigo Braulio Díez vuelve con sus historias para no dormir, con el artículo Las migraciones tienen veneno, una visión práctica y realista de lo que hay detrás de estos proyectos que, aunque a primera vista pueden parecer sencillos, tienen bastantes trampas ocultas.
Por último, desde CampusMVP nos llega un post que abre los ojos sobre la realidad del open source: ¿es gratis? ¿quién lo mantiene? ¿quién contribuye? ¿Es sostenible? Muchas preguntas interesantes a las que podremos dar respuesta en el post y vídeo donde José Manuel Alarcón y Jorge Turrado debaten sobre el tema.
El resto de enlaces, a continuación 🙂
Por si te lo perdiste...
- ¡No guardes como cadena el resultado JSON de la llamada a una API si lo único que quieres hacer es deserializarla!
José M. Aguilar - Personalizar la negociación de contenidos en ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- When will .NET Framework retire?
Steven Giesel - Implementing AES Encryption With C#
Milan Jovanović - How Fast is Microsoft C#? Discover the Advantages
Dave Ward - Moving from .NET 6 to 8
Joao Correia - Supporting multiple .NET SDK versions in analyzers and source generators
Andrew Lock - The New LINQ Methods from .NET 6 to .NET 9
Anton Martyniuk - Writing a .NET Garbage Collector in C#
Kevin Gosse - The Dangers of Async Void
Sergey Teplyakov - Useful New-ish Features in .NET/C#
David Ramel

Habitualmente los paquetes NuGet que usamos en un proyecto se registran en entradas <PackageReference>
de su archivo .csproj
. Es un mecanismo sencillo y efectivo cuando trabajamos con un único proyecto o un número reducido de ellos.
Sin embargo, cuando la cosa crece y estamos trabajando con muchos proyectos que usan paquetes comunes cuyas versiones deben estar alineadas, todo se complica un poco, y trabajar con ellos se puede convertir en algo bastante tedioso. Y más aún si no usamos una herramienta visual como NuGet Package Manager de Visual Studio.
Para estos escenarios, NuGet 6.2, lanzado en agosto de 2023 y presente por defecto en todas las instalaciones actualizadas de .NET y Visual Studio, introdujo el concepto de gestión centralizada de paquetes (en inglés, Central Package Management o CPM). Esta funcionalidad nos brinda la posibilidad de definir en un archivo independiente los paquetes utilizados, con sus versiones correspondientes, de forma que todos los proyectos de la solución puedan hacer referencia a él y mantener sus dependencias actualizadas.

Aquí tenemos la entrega número 594 de enlaces a contenidos interesantes que he ido recopilando durante la semana, con mucho .NET, ASP.NET Core, IA, Azure, JavaScript, CSS, herramientas de desarrollo y más.
En esta ocasión me gustaría destacar el post de Neo Kim sobre cómo funciona Bluesky. Me encantan estos posts que detallan los engranajes que hay por detrás de aplicaciones que todos conocemos y que tienen unos requisitos altísimos de escalabilidad y rendimiento.
También me ha resultado muy interesante el post de Milan Jovanović sobre cómo escalar monolitos, porque creo que puede ser de utilidad si tenéis aplicaciones que con el tiempo han ido creciendo más allá de lo que se esperaba en un principio.
También en la sección "cómo funcionan las cosas que usamos todos los días" 😉, el post de Moncef Abboud es muy interesante para profundizar un poco en los algoritmos de compresión más habituales.
Por último, me ha hecho ilusión ver que NDepend sigue evolucionando e introduciendo mejoras para ofrecer perspectivas únicas de nuestras bases de código. Vale la pena echarle un vistazo.
Y ahora, a por el resto...
Por si te lo perdiste...
- Invocar View Componentes usando Tag Helpers en ASP.NET Core MVC
José M. Aguilar - Usar kebab-case en rutas de aplicaciones ASP.NET Core MVC y Razor Pages
José M. Aguilar
.NET Core / .NET
- Why C# Developers Should Also Learn Rust, and What It Can Teach Them
Darren Horrocks - Announcing ConsoleApplicationBuilder, DI in console applications, simply
Peter Ritchie - Accessing MSBuild properties and user configuration from source generators
Andrew Lock - WinForms: Analyze This (Me in Visual Basic)
Klaus Loeffelmann - Seamless Slide Conversion: PowerPoint to Images in C#
Dharanya Sakthivel - Using Roslyn to analyze and rewrite code in a solution
Gérald Barré - The Disposable Pattern in ASP.NET Core
Ricardo Peres - C# Tip: How to create Custom Attributes, and why they are useful
Davide Bellone - Mastering BenchmarkDotNet: The Essential Benchmarking Library for .NET Developers
Jayraj Chhaya - 5 Effective Ways to Navigate PDF Pages in C# Using .NET PDF Library
Chinnu Muniyappan

En general, el uso de expresiones largas debería estar prohibido por ley. Hay pocas cosas que ataquen tanto a la legibilidad de un código como una expresión larga y compleja a la que tengamos que dedicar un buen rato cada vez que intentemos comprenderla. Y no digamos si nos toca modificarla 😱
Aunque esto es aplicable a cualquier tipo de expresión, en este post me voy a centrar en los predicados, que al fin y al cabo representan las condiciones que determinan el comportamiento de una aplicación.
Veamos un ejemplo de if
con un predicado que implementa una condición de negocio necesaria para que un usuario user
pueda realizar una tarea concreta en la cuenta account
:
if (account is not null && account.IsActive && account.HasSubscription
&& account.SubscriptionStartDate <= DateTime.Today && account.SubscriptionEndDate
>= DateTime.Now.AddDays(1) && (account.SubscriptionLevel == "Standard" ||
account.SubscriptionLevel == "Premium") && user.IsActive && (user.HasRole("admin")
|| (user.HasRole("owner"))) && user.AccountId == account.Id)
{
account.ChangePaymentMethod("paypal");
}
Es un poco difícil de leer, ¿verdad? 😅 Bueno, está algo forzado para ilustrar bien el ejemplo, pero seguro que en nuestras bases de código podríamos reconocer fragmentos conceptualmente similares.
Básicamente, la condición anterior verifica si el estado de la cuenta account
es válido para realizar la tarea, comprobando que sea correcta, esté activa, y tenga en vigor una suscripción de nivel "Standard" o "Premium", así como que el usuario user
tenga permisos para hacerlo, comprobando que esté activo, tenga un rol de "admin" u "owner", y pertenezca a la cuenta account
.
Obviamente, no podemos evitar que la lógica de negocio sea compleja, eso no depende de nosotros. Pero sí podemos hacer que la forma de expresarla mediante código sea más sencilla y legible, así que, ¡manos a la obra!

Aquí está la recopilación semanal número 593 de enlaces interesantes, donde podéis encontrar un montón de referencias a artículos sobre C#, .NET, ASP.NET, Azure, desarrollo web, inteligencia artificial, Visual Studio y otros temas 🙂
Destacable el post "Tendencias en programación JavaScript para 2025", de José Manuel Alarcón, donde desvela hacia dónde se dirige el desarrollo JavaScript este año recién estrenado, en términos de herramientas, frameworks, metaframeworks, programación en backend y los nuevos paradigmas impulsados por la irrupción de la inteligencia artificial. Si usáis este lenguaje y su ecosistema, no os lo perdáis.
Los que diseñáis sistemas distribuidos con ASP.NET Core, os puede venir bien echar un vistazo a la introducción de Ricardo Peres a la implementación de trazas distribuidas en ASP.NET Core.
El artículo de Mark Heath sobre el uso de tools de forma segura con LLMs, Using Tools (Safely) with LLMs, me ha sido útil para descubrir que las bibliotecas cliente de Azure OpenAI también tienen la capacidad de ejecutar herramientas, algo que pensaba que había que hacer manualmente o con frameworks más potentes como Semantic Kernel.
Y muy bueno el recopilatorio del equipo de Visual Studio sobre novedades destacables que se introdujeron en el producto durante 2024. Si usáis a diario esta herramienta, echadle un ojo porque hay cosas muy interesantes.
Espero que os sean de utilidad 🙂
Por si te lo perdiste...
- Comprimir el resultado de acciones específicas en ASP.NET Core MVC
José M. Aguilar - Non-nullable property must contain a non-null value when exiting constructor: 7 formas de evitar el warning CS8618 en C#
José M. Aguilar
.NET Core / .NET
- The memory leak in ConcurrentQueue
Oren Eini - Measuring the impact of locks and waits on latency in your .NET apps
Christophe Nasarre - Stop the Leaks: Properly Disposing Objects in .NET
David McCarter - C# foreach: Definition and Best Practices
Stackify Team - Reading compilation options and the C# version in source generators
Andrew Lock - Local inter-process communication over named pipes with ASP.NET Core or StreamJsonRpc in .NET
Anthony Simmon - Comparing Records, Structs, and Classes in C#: When to Use What?
Ali Hamza Ansari - Enhance Your .NET HttpClient with HSTS Support
Gérald Barré - Introducing MSBuild.Sdk.SqlProj 3.0 - create, build, validate, analyze, pack and deploy SQL database projects with .NET 9
Erik Ejlskov Jensen - Mastering C# - Pattern Matching
Jesse Liberty - The Transition of .NET FluentAssertions to Paid Software
Tomasz Sobczak - C# Enum: Definition and Best Practices
Stackify Team - Working with JsonSerializerContext in System.Text.Json and Refit
Tomasz Cielecki

Tras el parón navideño, volvemos a la carga con la primera recopilación de 2025 🙂
Bueno, la frase anterior no es del todo cierta. Por una parte, aunque haya dejado de publicar durante un par de semanas, no he dejado de recopilar enlaces, así que esta edición es especialmente extensa: más de 90 enlaces. Y por otra parte, en realidad sería la segunda recopilación, si contamos la revisión de los contenidos más vistos del blog durante el pasado año que publiqué ayer 😊
Pero bueno, al tema...
Es difícil destacar algo en concreto ante tanto contenido, pero quizás me quedo con el post "The Myth of Perfect Code: Why It’s Hurting You More Than Helping", donde Terrance Craddock reflexiona sobre lo que deberíamos considerar "código perfecto".
También me voy a quedar con algo que, por diferente, me ha llamado la atención: "Unique Solving Method for Rubik's Cube", un método para resolver el cubo de Rubik presentado de forma muy visual. Si sois de los que en los 80 pasasteis horas intentando resolverlo, seguro que como mínimo os resultará curioso 🙂
Por si te lo perdiste...
- Este código C# no compila. ¿Cómo lo hacemos funcionar sin tocarlo?
José M. Aguilar - Crear desplegables desde enums en ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- Critical: .NET Install links are changing
Richard Lander - Scheduling Background Jobs With Quartz in .NET (advanced concepts)
Milan Jovanović - Fast build and high security in .NET with Package Source Mapping
Tomasz Sobczak - Back to Basics: Using the Parallel Library to Massively Boost Loop Performance
Rick Strahl - Logging in .NET: Best Practices and Why You Should Love It
Marius Schröder - 10 Reasons to Upgrade to .NET 9
Anton Martyniuk - Vogen: turn your primitives (ints, decimals etc.) into value objects that represent domain concepts
Steve Dunn - StackOverflowException vs. OutOfMemoryException
Sergey Teplyakov - Static Lambda in C# 12 : Performance Improvement
Devesh Omar - C# Null-Conditional (?.) & Null-Coalescing (??) Operators Explained
Ivan Kahl - Automatically format your dotnet code using dotnet format
Josef Ottosson - Think Beyond Synchronous: The Ultimate Guide to Tasks in C#
Chris Woodruff - Moq Unit Testing in .NET Core with xUnit
Jaimin Shethiya - Implementing an interceptor with a source generator
Andrew Lock - Writing a String Numeric Comparer with .NET 9
Khalid Abuhakmeh - .NET 9 upgrade - notnull constraint
Bart Wullems - Exploring CollectionsMarshal for Dictionary
Gérald Barré - C# 12.0: collection expressions
Ian Griffiths - Writing a .NET profiler in C#
Kevin Gosse - Modern C# Part 3 – Switch Expressions
Jesse Liberty

Pues sí, se acabaron las fiestas y aquí estamos de nuevo, volviendo a la rutina. Con el 2025 recién estrenado, ante todo, me gustaría aprovechar la ocasión para desearos que sea un gran año en todos los sentidos🙂
Y para empezar con buen pie, vamos a seguir la tradición de aprovechar este primer post para hacer un breve recopilatorio de los artículos más leídos el año anterior, con idea de que podáis descubrir contenidos que quizás os habíais perdido, reencontraros con algo que os interesó en su momento, o simplemente ver qué contenidos están llamando más la atención al resto de lectores del blog.
Top 10 posts 2024 en Variable Not Found
En décimo lugar, inaugurando el top ten de 2024 tenemos una llamada de atención: el artículo "¡No uses ContainsKey() en un diccionario .NET para ver si existe un elemento antes de obtenerlo!" muestra el impacto en el rendimiento de la doble búsqueda (una para ver si existe el elemento y otra para obtenerlo) y cómo podemos solucionarlo fácilmente con las herramientas que proporciona el propio framework.
Seguidamente, en el noveno puesto de la lista, respondemos a una pregunta bastante habitual cuando empezamos con ASP.NET Core: ¿por qué mi aplicación no arranca? En el artículo "No se puede conectar al servidor web 'https', el servidor web ya no funciona y otras pistas de que no has lanzado correctamente tu aplicación ASP.NET Core", además de la respuesta, veremos otros síntomas que nos pueden ayudar a identificar el problema. Spoiler: has olvidado incluir el app.Run()
al final del código de inicialización 😉