
Hace unos días, Variable Not Found cumplió 19 años desde su post inaugural, en aquel lejano mayo de 2006. Durante todo este tiempo, ha sido un compañero de viaje con el que he ido compartiendo mis reflexiones, descubrimientos y aprendizaje sobre el mundo del desarrollo de software, con la ilusión de que pudieran ser útiles a alguien más.
No puedo decir que no me haya costado trabajo, y sobre todo, mucho tiempo, pero creo que ha sido recompensado con creces, tanto a nivel personal como profesional. Cada post ha sido una oportunidad para aprender algo nuevo y de profundizar en temas que me han interesado. He tenido la fortuna de sentirme parte de una comunidad increíble, en la que he podido conocer gente que comparte mis intereses e inquietudes, y en algunos casos, llegar a forjar amistades con personas brillantes, a las que admiro y respeto profundamente. Y sin duda, la visibilidad que me ha dado el blog me ha permitido acceder a oportunidades y proyectos a los que probablemente no habría llegado de otra manera.
Todo esto ha sido posible gracias a vosotros, queridas amigas y amigos del blog, porque sin vuestro apoyo este viaje no habría tenido sentido. Mil gracias por estar siempre ahí 🥰
Y para celebrarlo, como es habitual, vamos a hacer un pequeño repaso de lo que ha sido la temporada 2024-2025 en el blog en términos de visitas y visitantes, un ejercicio de transparencia que he realizado en cada aniversario desde hace más de quince años. En este caso, ya os adelanto que la desastrosa tendencia que veníamos observando en los últimos años incluso se ha acentuado, así que la cosa no va bien 😢
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: aniversario, autobombo, blogging

Aquí tenéis los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Muy destacable esta semana el análisis de José Manuel Alarcón sobre el impacto de la IA en nuestra profesión. Un artículo que no te puedes perder si te preocupa aquello de que la "IA va a acabar con los programadores" o "no te hace falta saber programación, porque la IA lo hará todo por ti".
Interesante también la reflexión de Derek Comartin sobre el uso de APIs para CRUD y los problemas de diseño que introduce en nuestras aplicaciones.
Y Raymond Chen sigue trayéndonos curiosidades sobre Windows y sus mecanismos internos. En esta ocasión, nos cuenta los motivos de que el portapapeles de Windows no almacene correctamente los cambios rápidos en su contenido.
El resto, a continuación.
Por si te lo perdiste...
- Acceder a parámetros de query string desde componentes Blazor 8 de cualquier tipo
José M. Aguilar - ¿Dónde está Server.MapPath() en ASP.NET Core?
José M. Aguilar
.NET
- Mastering Kafka In .NET: Schema Registry & Error Handling Made Simple
Hamed Salameh - Exploring the new AI chat template
Andrew Lock - WebView2: Waiting for Document Loaded
Rick Strahl - What's New in .NET 10 Preview: Top Features Developers Shouldn't Miss
Vijayakumar Srinivasan - Why we built our startup in C#
Sam Cox - [TIP] From Custom Converters to Attributes: Polymorphic Serialization Made Easy in .NET
Juan Luis Guerrero - C# 13: Partial Properties and Indexers Simplified
Arkadeep De - Boost Your .NET Projects: Simplify Dictionary Handling with AutoDefaultDictionary in Spargine
David McCarter - Event-Driven Architecture in .NET with RabbitMQ
Milan Jovanović - Common HttpClient tasks you're googling or asking ChatGPT
Thomas Ardal - StringComparison.InvariantCulture is not always invariant
Gérald Barré - Best Practices for Managing Shared Libraries in .NET Applications at Scale
Sergio Vaning - A Simple State Machine in .NET - Adding Code-based Implementation
Ricardo Peres - C# 14 - Exploring extension members
Kathleen Dollard

Hace unas semanas estuvimos hablando de los atributos englobados en la categoría de "caller information" de .NET: [CallerFilePath]
, [CallerLineNumber]
, [CallerMemberName]
y [CallerArgumentExpression]
. Como vimos, estos atributos permiten 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.
Sin embargo, ninguna de estas opciones nos permite saber cuál es la clase que contiene el código que ha llamado al método que está actualmente en ejecución, algo que podría venir bien en algunos escenarios. Por ejemplo, recientemente me lo he encontrado revisando un proyecto en el que se utilizaba el sistema de logging NLog, donde encontraba un código como el siguiente para obtener y almacenar de forma estática un logger para la clase actual:
public static class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
public static void DoSomething()
{
try
{
Logger.Info("Hello world");
System.Console.ReadKey();
}
catch (Exception ex)
{
Logger.Error(ex, "Goodbye cruel world");
}
}
}
A la vista de estas líneas, puede parecernos difícil deducir qué hace ese método GetCurrentClassLogger()
por detrás para saber cuál es la clase actual y crearle un logger específico para ella.
En este post, vamos a abrir el capó para ver la "magia" que hace esto posible.

Ya tenemos los enlaces recopilados durante la última semana, la que muchos de los de aquí recordaremos como "la del apagón". Vaya movida, ¿eh? 😄
Interesante la lectura del post de Andrew Lock sobre la creación de un lifetime de inyección de dependencias "pooled".
Curioso el artículo de Raymond Chen sobre por qué Windows 7, durante unos meses, se iniciaba más lento si tenías un fondo de pantalla de color sólido (?)
Y de nuevo destacamos un post de Juan Luis Guerrero, que nos habla de cómo automatizar pruebas unitarias en .NET con GitHub Copilot Agents.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Deserialización y serialización personalizada en .NET con System.Text.Json usando custom converters
José M. Aguilar - ¿Dónde están Application_Start y Application_End en ASP.NET Core?
José M. Aguilar
.NET
- Automate Unit Tests in .NET with GitHub Copilot Agents: Prompt, Iterate, and Win!
Juan Luis Guerrero - Protecting against indirect prompt injection attacks in MCP
Sarah Young - The null check that didn't check for nulls
Oren Eini - HttpClient improvements in .NET 10
Steven Giesel - Creating a 'pooled' dependency injection lifetime
Andrew Lock - How To Implement Retries and Resilience Patterns With Polly and Microsoft Resilience
Anton Martyniuk - Option<T>: Where Null Is Not an Option
Chris Woodruff - General Availability of AWS SDK for .NET V4.0
Norm Johanson - 4 real-life examples of using reflection in C#
Ali Hamza Ansari - AsyncEnumerable in C#: The importance of EnumeratorCancellation attribute
Bart Wullems - Destructuring: Pattern Matching’s Power Move
Chris Woodruff - The Optimisation Lie: Why Your 'Optimised' Code Might Still Be Slow
Darren Horrocks

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ć

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