
Si os gusta trastear con las previews de .NET en el mismo equipo en el que estáis desarrollando proyectos que usan versiones estables, es posible que al compilar encontréis en la consola o ventana Output de vuestro IDE favorito un mensaje de error parecido al siguiente:
NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy
Básicamente, el sistema nos está informando de que estamos usando un SDK que aún está en fase de pruebas, o preview. Aunque esto no debería ser un problema porque el SDK debería ser totalmente compatible hacia atrás, simplemente es un recordatorio de que no es la versión estable y siempre podríamos encontrarnos algún problema.
Esto ocurre porque los comandos del SDK utilizan la última versión instalada en el equipo, por lo que, si hemos instalado una versión preliminar, será ésta la que se utilice. Podemos comprobarlo fácilmente ejecutando el siguiente comando en consola, que nos mostrará la versión del SDK que se está utilizando por defecto:
C:\> dotnet --version
10.0.100-preview.5.25277.14
Normalmente, el mensaje NETSDK1057 podemos ignorarlo sin problema, pero si por cualquier motivo queremos eliminarlo o simplemente queremos forzar el uso de una versión determinada del SDK de .NET en algún proyecto o de forma global, podremos hacerlo usando un archivo llamado global.json
.
Forzar la versión del SDK
Para forzar el uso de una versión específica del SDK de .NET, bien sea de forma global o bien en un proyecto concreto, lo primero que debemos hacer es determinar qué versiones del SDK tenemos instaladas en nuestro equipo. Para ello, podemos ejecutar el siguiente comando en la consola:
C:\> dotnet --list-sdks
2.1.818 [C:\Program Files\dotnet\sdk]
3.1.426 [C:\Program Files\dotnet\sdk]
6.0.301 [C:\Program Files\dotnet\sdk]
6.0.321 [C:\Program Files\dotnet\sdk]
7.0.120 [C:\Program Files\dotnet\sdk]
8.0.117 [C:\Program Files\dotnet\sdk]
8.0.206 [C:\Program Files\dotnet\sdk]
8.0.411 [C:\Program Files\dotnet\sdk]
9.0.301 [C:\Program Files\dotnet\sdk]
10.0.100-preview.5.25277.14 [C:\Program Files\dotnet\sdk]
Una vez sabemos qué versiones del SDK tenemos instaladas y cuál queremos forzar, lo siguiente es crear un archivo llamado global.json
. Su ubicación es importante, porque su ámbito se extiende a todos los proyectos que estén en la misma carpeta o en sus subdirectorios a cualquier nivel de profundidad.
Es decir, si creamos el archivo global.json
en la raíz de un proyecto, afectará únicamente a ese proyecto y a sus subproyectos. Si lo creamos en una carpeta superior, por ejemplo en la carpeta de una solución, afectará a todos sus proyectos, que típicamente se encontrarán en subdirectorios. Si lo creamos en la carpeta raíz de un disco duro, afectará a todos los proyectos guardados en él.
El archivo global.json
es un archivo JSON con una estructura muy sencilla (podéis consultarla siguiendo este enlace). Básicamente en él indicaremos la versión del SDK que queremos forzar a los proyectos que se encuentren en su ámbito, así como algunas opciones adicionales para personalizar su comportamiento.
Veamos un ejemplo sencillo. Si queremos forzar el uso de la versión 9.0.301
en un proyecto, basta con crear el archivo global.json
en su raíz con el siguiente contenido:
{
"sdk": {
"version": "9.0.301"
}
}
La propia CLI de .NET también nos permite hacerlo usando el comando dotnet new global.json --sdk-version <version>
, que creará el archivo global.json
en la carpeta actual, forzando la versión del SDK que le indiquemos. El contenido del archivo creado será exactamente el mismo que el del ejemplo anterior:
C:\MyProject>dotnet new global.json --sdk-version 9.0.301
The template "global.json file" was created successfully.
C:\MyProject>type global.json
{
"sdk": {
"version": "9.0.301"
}
}
En cualquiera de los casos, si sobre la misma carpeta o alguna de sus subcarpetas consultamos el SDK utilizado por defecto, obtendremos el valor esperado:
C:\MyProject>dotnet --version
9.0.301
C:\MyProject>md Test
C:\MyProject>cd Test
C:\MyProject\Test>dotnet --version
9.0.301
A partir de este momento, dado que ya no estamos usando la versión preview del SDK, el mensaje de aviso habrá desaparecido 😊
Posibles efectos secundarios
Sin duda, usar global.json
es una forma muy sencilla de forzar una versión del SDK de .NET en un proyecto o en un conjunto de proyectos. Sin embargo, al hacerlo también podemos estar introduciendo algunos inconvenientes que debemos considerar.
En primer lugar, si forzamos una versión del SDK que no está instalada en el equipo, obtendremos un error al intentar compilar o ejecutar el proyecto. Normalmente no ocurrirá en casos de desarrolladores aislados o si se hace de forma global, pero pueden surgir problemas si trabajamos en un equipo de desarrollo y alguno de los miembros no tiene instalada la versión del SDK que hemos forzado, pues se encontrará con el error al intentar compilar el proyecto.
Por ejemplo, si forzamos en el global.json
el uso del SDK 9.0.400
, que no está instalado en el equipo, al intentar compilar el proyecto obtendremos un error similar al siguiente:
C:\MyProject>dotnet build
The command could not be loaded, possibly because:
* You intended to execute a .NET application:
The application 'build' does not exist or is not a managed .dll or .exe.
* You intended to execute a .NET SDK command:
A compatible .NET SDK was not found.
Requested SDK version: 9.0.400
global.json file: C:\MyProject\global.json
También debemos tener en cuenta que al forzar una versión específica del SDK, podemos estar limitando el uso de nuevas características o mejoras que se vayan introduciendo en versiones posteriores del SDK. Es decir, si la versión estable actual es la 9.0.301
y se lanza la 9.0.400
, no pasaremos a usar esta última de forma automática, será necesario actualizar el global.json
para referenciar la nueva versión.
Por último, a la hora de forzar una versión del SDK, sobre todo si se hace de forma global, también es importante tener en cuenta que cada versión del SDK admite un conjunto de versiones del runtime de .NET. Por ejemplo, si forzamos el uso del SDK 9.0.301
, no podremos compilar o ejecutar proyectos cuyo <TargetFramework>
en el archivo .csproj
sea superior a net9.0
, como net10.0
o posteriores:
C:\MyProject>dotnet build
C:\Program Files\dotnet\sdk\9.0.301\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(166,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 10.0. Either target .NET 9.0 or lower, or use a version of the .NET SDK that supports .NET 10.0. Download the .NET SDK from https://aka.ms/dotnet/download
Cómo forzar la última versión estable
Afortunadamente, muchos de estos problemas podemos solucionarlos usando opciones adicionales en el archivo global.json
.
Por ejemplo, si queremos que el SDK use la última versión estable instalada en el equipo, sea cual sea su número de versión, podemos usar la opción allowPrerelease
. Dado que no usamos la propiedad version
para especificar una versión concreta, el sistema simplemente buscará la más reciente que no sea preview:
{
"sdk": {
"allowPrerelease": false
}
}
El valor por defecto de
allowPrerelease
puede variar según el entorno. En la CLI suele sertrue
, pero si estamos en Visual Studio, depende de lo que hayamos configurado en la secciónHerramientas>Opciones>Entorno>Características de versión preliminar
.
Adicionalmente, existe la propiedad rollForward
, que nos permite controlar cómo se comporta el SDK cuando no existe la versión del SDK que hemos especificado en la propiedad version
, o cómo actuar si existen versiones posteriores a la especificada. Pero esto, si os interesa, lo veremos en un artículo posterior, y mientras tanto, podéis consultar la documentación oficial para más detalles.
Conclusión
En resumen, el uso de global.json
nos permite tener un control preciso sobre la versión del SDK de .NET utilizada en nuestros proyectos, evitando sorpresas y mensajes de advertencia relacionados con versiones preliminares. Sin embargo, es importante conocer sus implicaciones y utilizarlo de forma consciente, especialmente en entornos colaborativos.
¡Espero que os resulte útil!

Buena cosecha la semana pasada, con mucho contenido interesante 🙂
Destacamos el lanzamiento de la quinta preview de .NET 10, que esta vez incluye cambios en C#, ASP.NET Core, Blazor, .NET MAUI y otras áreas.
Rick Strahl nos enseña a añadir paquetes NuGet en tiempo de ejecución a una aplicación, algo que puede ser muy útil en sistemas con plugins o extensiones.
Vale la pena también echar un vistazo a Next Edit Suggestions, una nueva característica de GitHub Copilot para Visual Studio y Code que sugiere la siguiente edición en el código, lo que puede mejorar la productividad de los desarrolladores.
Shalitha Suranga comparte sus reflexiones sobre el declive de los blogs técnicos y cómo los desarrolladores somos los únicos que podemos hacer algo para que no desaparezcan.
Finalmente, Ricardo Peres nos presenta RazorSharpener, un componente que simplifica la compilación y renderización de componentes Razor en tiempo de ejecución.
Más contenidos interesantes, a continuación.
Por si te lo perdiste...
- Procesar secuencias por lotes, o cómo usar chunks en C#
José M. Aguilar - Autenticación JWT en APIs con ASP.NET Core
José M. Aguilar
.NET
- .NET 10 Preview 5
James Montemagno - Adding Runtime NuGet Package Loading to an Application
Rick Strahl - Don't reinvent the wheel
Josef Ottosson - Federated Identity in .NET: A Complete Guide for Software Architects
Sudhir Mangla - Converting a Microsoft XNA 3.1 game to MonoGame
Andrew Lock - How to Create and Convert PDF Documents in ASP.NET Core
Anton Martyniuk - Are Your LINQ Queries Slowing Down Your App? Here's How to Fix Them
Meena Alagiah - Repeating a test multiple times in C#
Bart Wullems - C# Tip: Handling exceptions with Task.WaitAll and Task.WhenAll
Davide Bellone - Queue-Based Load Leveling Pattern in C#: Cloud Stability, Scalability & Best Practices
Sudhir Mangla - Domain-Driven Design Principles: Value Objects in ASP.NET Core
Assis Zang - Run C# Scripts With dotnet run app.cs (No Project Files Needed)
Milan Jovanović

Desde la aparición de Blazor y sus distintos tipos de hosting de componentes (SSR, Server, WebAssembly), se intentó promover que estos fueran agnósticos respecto a su modo de ejecución. Sin embargo, en la práctica esto no es siempre posible, y en ocasiones necesitamos saber en qué modo se está ejecutando un componente para poder adaptarlo a las necesidades de la aplicación.
Hace más de un año, cuando aún Blazor 8 era la versión más reciente de este framework, vimos por aquí un truco para detectar si un componente Blazor estaba ejecutándose de forma estática (SSR) o interactiva. Y algunos años antes, ya habíamos visto también distintas formas para detectar si un componente interactivo estaba corriendo sobre Blazor Server o Blazor WebAssembly.
Aunque las soluciones propuestas funcionaban bien y solucionaban nuestro problema, eran simplemente trucos (o "hacks", algo retorcidos en algunos casos) para cubrir unas necesidades que no estaban bien resueltas desde el propio framework.
Con .NET 9 esto cambió, y desde esta versión de Blazor ya existen mecanismos nativos para detectar cuándo un componente se ejecuta en modo estático o interactivo, y en este último caso, qué modo de renderizado se está utilizando.
Vamos a ver cómo conseguirlo.

Aquí está ya la recopilación semanal de enlaces a contenidos a los que vale la pena echarles un vistazo, sobre .NET, patrones, buenas prácticas, acceso a datos, IA, desarrollo web y tooling, entre otros temas.
Esta semana destacamos un interesante post de Chema Alonso sobre cómo saltarse las restricciones de ChatGPT y otros LLMs para obtener imágenes prohibidas utilizando el conocimiento que ya tienen del mundo.
También, José Manuel Alarcón nos cuenta en un detallado artículo las novedades que podemos encontrar en el recién lanzado Angular 20.
Gregor Sutttie nos habla de una de las novedades presentadas en Microsoft Build 2025: los asistentes de actualización de .NET, que nos ayudarán a modernizar nuestras aplicaciones y migrarlas a las últimas versiones.
Me ha llamado la atención el log buffering, una característica de .NET 9 que desconocía y que permite retrasar el momento en que se emiten las trazas. Nos lo cuenta Evgenii Fedorov en su post Emit logs on-demand with log buffering.
Y por último, Braulio Díez nos recuerda la importancia de saber decir que no.
El resto, a continuación 🙂
Por si te lo perdiste...
- Probar scripts en producción sin desplegar nada, y otros usos interesantes de Fiddler
José M. Aguilar - Deserializar un objeto JSON a un diccionario .NET con System.Text.Json
José M. Aguilar
.NET
- Why is enumerating over List faster than IList?
Steven Giesel - Boost Your .NET Projects: Enhance Your Workflow with AssemblyHelper in Spargine
David McCarter - Creating your first sample game with MonoGame
Andrew Lock - Sniffing HttpClient
Sergio León - Upgrading Your .NET Applications: Exploring .NET Upgrade Assistants at Microsoft Build
Gregor Suttie - IEnumerable vs. IAsyncEnumerable in .NET: Streaming vs. Buffering
Ali Hamza Ansari - Deep C# - Delegates
Mike James - Automating Null-Forgiving Operator Removal in C# Projects
Gérald Barré - Making Event Sourcing with Marten Go Faster
Jeremy D. Miller - Catch Up on Microsoft Build 2025: Essential Sessions for .NET Developers
.NET Team - Emit logs on-demand with log buffering
Evgenii Fedorov

Desde hace ya bastante tiempo, el equipo de .NET está introduciendo mejoras en el SDK para simplificar algunos escenarios y facilitar el acceso a la tecnología de desarrolladores que, o bien están empezando, o bien proceden de otras plataformas.
Una de estas mejoras fueron los top level statements, que permiten escribir los entry points de nuestras aplicaciones C# sin necesidad de definir una clase o un método Main
. También las directivas using
globales e implícitas ayudaban a reducir el boilerplate necesario para escribir una aplicación C#.
Pero esta vez han ido más lejos 🙂
Con .NET 10, se está trabajando en eliminar toda la ceremonia necesaria para crear y ejecutar una aplicación .NET simple. De la misma forma que se puede hacer en otras plataformas y lenguajes como Node.js o Python, ahora bastará con crear un archivo con extensión .cs
y ejecutar el comando dotnet run
para compilar y ejecutar el archivo sobre la marcha. Es decir, pasamos de aplicaciones basadas en proyecto a aplicaciones basadas en archivos.
Pero, además, esto abre interesantes posibilidades para la creación de prototipos, pruebas rápidas o incluso para la creación de scripts que aprovechen el poder de .NET y C# sin necesidad de crear un proyecto completo.
Lo vemos en profundidad a continuación.

Una semana más, aquí tenéis la recopilación de los contenidos que he ido encontrando durante los últimos días. (Afortunadamente) menos enlaces que semanas anteriores, pero aún así, muchas novedades y material interesante sobre .NET, JavaScript, IA, herramientas, patrones y buenas prácticas, entre otros.
Destacamos la reflexión de José Manuel Alarcón, derivada a su vez de un artículo de Dustin Curtis, sobre el impacto del uso de la IA sobre el aprendizaje. Realmente es uno de los temas que más me preocupan sobre el uso masivo de la IA, porque, como siempre se ha dicho, "lo que no se usa, se atrofia". ¿Se va a atrofiar nuestra capacidad de razonamiento, de análisis, de crítica, de creación? ¿Vamos a perder la capacidad de pensar por nosotros mismos? ¿Podríamos quedar relegados a ser la interfaz física de una inteligencia externa que nos diga qué hacer en cada momento? Bueno, esperemos que no, pero debemos estar atentos.
Desde CampusMVP nos llega una alerta, especialmente importante si trabajamos con sitios web y aplicaciones que usan certificados HTTPS: todos caducarán cada 47 días. Nos toca revisar nuestros procesos de renovación y automatizarlos al máximo, tanto por seguridad como por comodidad.
Eladio Rincón actualiza su benchmark de generación de SQL a partir de lenguaje natural usando LLMs.
Interesante también la visión de Microsoft sobre el futuro del proceso de desarrollo de aplicaciones, donde colaboraremos con agentes IA en todas las fases del ciclo de vida: conceptualización, prototipado, generación de código, tests, mejoras, despliegue, monitorización, etc.
Angular 20 ya está aquí: estabilización de APIs, nuevas herramientas de depuración, mejoras en comprobación de tipos, literales en plantillas, server-side y más.
El resto, a continuación.
Por si te lo perdiste...
- ¿Podría Blazor llegar a reemplazar a MVC?
José M. Aguilar - Usar plantillas personalizadas de ASP.NET Core MVC desde línea de comandos
José M. Aguilar
.NET
- Stop modifying your appsettings for local development. (please)
Barrett Stolzman - How to Get Windows 8.3 Short File Names Using FindFirstFileW (UNC) and GetShortPathName (local) in C#
Niels Rasmussen - Avoiding reflection in C# in way unsafer ways!
Steven Giesel - Coding Faster with dotNetTips Spargine: Validating Arguments Made Easy with Validator
David McCarter - Using Pattern Matching in C# for Performance Optimization
Gérald Barré - Using C# Ignored Directives: A Guide for Programmers
Vijay Anand - Building a Custom Domain Events Dispatcher in .NET
Milan Jovanović - Circuit Breaker Policy Fine-tuning Best Practice
Xin Lyu - Fine-tune the volume of logs your app produces
Evgenii Fedorov - An Alternative to nuget install-package
Bryan Hogan - Configuring Microsoft.AI.Extensions with multiple providers
Rick Strahl

Cuando usamos tipos enumerados en C#, muchas veces buscamos seguridad. Los valores de un enum
son constantes conocidas de antemano y se comprueban en tiempo de compilación, lo que evita asignaciones inválidas que podrían derivar en errores en tiempo de ejecución.
También, el hecho de poder acceder a los valores del enum
utilizando nombres o identificadores descriptivos da lugar a un código más legible y fácil de mantener. Y encima, las ayudas para el autocompletado y descubrimiento de valores posibles que nos proporcionan los IDEs modernos nos ayudan a ser más productivos. Todo son ventajas 🙂
Sin embargo, los enum
de C# sólo permiten que sus valores subyacentes sean numéricos ( byte
, sbyte
, short
, ushort
, int
-el tipo por defecto-, uint
, long
o ulong
). Esto puede suponer una limitación en casos en los que nos vendría bien disfrutar de todos los beneficios anteriores, pero usando valores string
... es decir, deberíamos poder definir un tipo que pueda contener únicamente un conjunto de cadenas de texto predefinidas.
Algunos lenguajes como TypeScript, Python o Swift soportan de forma nativa la creación de enumerados de texto; en cambio, en C# no tenemos esta posibilidad. Pero bueno, no todo está perdido... gracias a la flexibilidad del lenguaje, podemos conseguir algo bastante parecido 😉

Como todos los lunes, aquí tenemos ya los enlaces a contenidos interesantes que he ido recopilando durante la semana pasada, donde la IA ha sido la gran protagonista.
La verdad es que la semana ha sido una locura, tanto que no he podido seguir el ritmo de los contenidos que han ido publicándose, sobre todo debido a la celebración del evento de I/O 2025 de Google y Build 2025 de Microsoft. A estos adicionalmente se han sumado otros lanzamientos y novedades interesantes, así como los posts técnicos que nos encontramos habitualmente en estas recopilaciones. El resultado: más de 80 enlaces a contenidos que no os podéis perder 😊
Con tanto material es difícil destacar algo concreto, pero creo que como mínimo deberíais echarle un vistazo a los siguientes links:
- Resumen de novedades y presentaciones de Google I/O 2025
- Novedades presentadas en Microsoft Build 2025
Aparte, ya se ha lanzado la preview de la nueva y controvertida versión del compilador nativo de TypeScript basado en Go.
También me ha llamado la atención el salto a open source de varios productos, como la extensión Github Copilot Chat para Visual Studio Code, el Windows subsystem for Linux, y Edit, un editor de línea de comandos que no conocía.
Por último, un toque de nostalgia noventera con el artículo de Antonio Vallejo sobre el botón turbo de los PCs de la época, que en realidad no aceleraba el PC sino todo lo contrario. Todo un alarde de creatividad marketiniana.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Parámetros opcionales en lambdas con C# 12
José M. Aguilar - Precompilación de vistas MVC en ASP.NET Core
José M. Aguilar
.NET
- A sub-millisecond GC for .NET?!
Alfred White - Writing new guards with extensions in C# 14
Steven Giesel - Nullable bool and if statement
Jiří Činčura - “ZLinq”, a Zero-Allocation LINQ Library for .NET
Yoshifumi Kawai - Memory leak from improper usage of Microsoft.Extensions.Configuration APIs in .NET on Windows
Matt Hamrick - Transforming an image into a table with Windows OCR
Bruno Sonnino

El operador "?." (también conocido como safe navigation operator, null-conditional operator, optional chaining operator o incluso Elvis operator) se introdujo en C# 6.0, en el año 2015. Este conocido operador simplifica el acceso a miembros de un objeto que ocasionalmente podría ser nulo, evitando la necesidad de realizar comprobaciones explícitas de nulidad.
var friend = GetFriendOrNull(1);
var name = friend?.Name; // Si friend es nulo, name será nulo, pero no explotará
Sin embargo, si queremos acceder a una propiedad para asignarle un valor, el operador "?." no es suficiente. Por ejemplo, si queremos asignar un valor a la propiedad Age
de un objeto friend
sospechoso de ser nulo, debemos comprobarlo manualmente antes de realizar la asignación:
var friend = GetFriendOrNull(1);
if (friend != null)
{
friend.Age = 23;
}
Esto cambiará con C# 14, cuyo lanzamiento está previsto para noviembre de 2025, acompañando a .NET 10, que extenderá el uso de este operador también a la asignación de valores a miembros, completando así su funcionalidad.
Se trata de una característica muy esperada por la comunidad desde hace años, ya que simplificará y hará el código más legible. En este artículo, exploraremos cómo funcionará esta nueva característica y qué implicaciones tendrá en nuestro código.

Tenemos una buena cosecha esta semana 🙂 Enlaces a unos 60 contenidos para estar al día sobre .NET, ASPNET Core, Blazor, buenas prácticas, IA, programación web y otros temas interesantes.
Y como es habitual, vamos a destacar algunos de ellos.
En primer lugar, José Manuel Alarcón nos recuerda que en unos días entrará en vigor la Ley de Accesibilidad Europea (EAA), que es de obligado cumplimiento y afecta a todos los sitios web y aplicaciones.
Braulio Díez nos habla de mock servers y cómo pueden ayudarnos a separar el desarrollo de backend y frontend en proyectos de una cierta complejidad.
Por último, dos de Microsoft. Por un lado, Amanda Silver celebra haber alcanzado 50 millones de desarrolladores usando Visual Studio y Visual Studio Code.
Y por otro, la llegada de .NET Preview 4, con novedades en librerías, runtime, ASP.NET Core, Blazor, MAUI, WPF y Entity Framework Core y otros. Podéis ver los detalles aquí.
Por si te lo perdiste...
- Acceder al objeto HttpContext desde componentes Blazor
José M. Aguilar - Cancelación de peticiones en ASP.NET Core y MVC
José M. Aguilar
.NET
- .NET 10 Preview 4 is now available!
Rick Brewster - Clearing NuGet Caches
Steven Giesel - Use C# 14 extensions to simplify enum Parsing
Gérald Barré - Boost Your .NET Projects: Supercharge Your Code with FastStringBuilder in Spargine
David McCarter - 3 Perfect Use Cases for C# 14’s field Keyword
Sukhpinder Singh

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 😢

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

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