
Llevamos utilizando la clase Random
de .NET para generar números aleatorios desde hace mucho tiempo, en su aparición con la versión 1.1 de .NET Framework (año 2002). Probablemente por eso, muchos de nosotros la usamos de forma automática, sin pararnos a estudiar todas sus posibilidades y las novedades que le han ido añadiendo a lo largo del tiempo.
En este artículo vamos a ver algunas características de la clase Random
que quizás no conocías... o quizás sí, pero que no está de más refrescarlas:
- Los números generados no son realmente aleatorios.
- En versiones antiguas de .NET, era más probable que
Random
generara números impares. - No se debe usar
Random
para operaciones criptográficas. - No es buena idea crear un objeto
Random
cada vez que necesitemos un número aleatorio. - Si estamos en .NET 6+, mejor usar
Random.Shared
. - El método
Shuffle()
desordena arrays. - El método
GetItems()
permite obtener elementos aleatorios de una colección. - Podemos heredar de
Random.
¡Vamos a ello!
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: .net

Aquí están los enlaces recopilados durante la semana pasada 😊
Entre los contenidos destacables, una pregunta: ¿somos conscientes del coste real de las operaciones de boxing y unboxing en .NET? Normalmente no las tenemos en cuenta, pero pueden llegar a ser importantes, y podemos aprender a detectarlas y evitarlas. Ali Hamza Ansari nos lo explica en su artículo.
También, Anton Martyniuk ha recopilado en este post una serie de paquetes NuGet que pueden mejorar tu productividad y la calidad de tus proyectos si usas Entity Framework Core.
Y Addy Osmani nos cuenta la historia, evolución y futuro de Core Web Vitals, los indicadores de rendimiento web que Google utiliza para medir la experiencia de usuario en las páginas web. Muy interesante.
El resto, a continuación...
Por si te lo perdiste...
- Renderizar componentes Blazor en vistas MVC (3/3): componentes interactivos WebAssembly
José M. Aguilar - El tipo de retorno ActionResult<T> en ASP.NET Core
José M. Aguilar
.NET
- xUnit Assert basics: True/False, Equal, Same, Matches
David Grace - Hidden Costs of Boxing in C#: How to Detect and Avoid Them
Ali Hamza Ansari - Why Microsoft Won't Revive WinForms (And What Developers Are Using Instead
Matt Mattei - Is .NET 10 for AI Replacing Python?
Prayag Vakharia - Your HTML Comments Are More Powerful Than You Think: Building Custom Validation Grammars with HtmlAgilityPack
Aaron Stannard - Wasm 3.0 for .NET Developers
Sam Basu

Ya he publicado en mi blog la colección de enlaces a contenidos interesantes de la semana pasada 🙂
Para destacar, Milan Jovanović nos habla sobre el problema que surge al intentar coordinar tareas que se ejecutan en distintos procesos o instancias, algo que escapa al alcance de los mecanismos de sincronización tradicionales como mutex, locks o semáforos de .NET, y algunas fórmulas para resolverlo.
Andrew Lock comparte los detalles del desarrollo de 'sleep-pc', una pequeña herramienta de línea de comandos que permite poner el PC a dormir después de un tiempo determinado. Usa .NET Native AOT y es instalable directamente desde NuGet.
Y por último, David Grace nos explica los distintos atributos que xUnit pone a nuestra disposición para proporcionar datos a los tests, y las diferencias entre ellos.
El resto, a continuación.
Por si te lo perdiste...
- Renderizar componentes Blazor en vistas MVC (2/3): componentes interactivos en servidor
José M. Aguilar - Generar redirecciones HTTP 307 y 308 en ASP.NET Core MVC
José M. Aguilar
.NET
- Building Resilient Email Delivery Systems: SendGrid vs Azure Communication Services with Polly in .NET
Sudhir Mangla - Distributed Locking in .NET: Coordinating Work Across Multiple Instances
Milan Jovanović - How to use InlineData, MemberData and ClassData in xUnit
David Grace - sleep-pc: a .NET Native AOT tool to make Windows sleep after a timeout
Andrew Lock - Migrating a Modular Monolith to Microservices in .NET: Step-by-Step Guide
Anton Martyniuk - Batch migrate .sln files to .slnx format across repositories
Gérald Barré - Expression Trees in C#: Building Dynamic LINQ Queries at Runtime
Ali Hamza Ansari - Flow: A Pragmatic Approach to Composable Business Logic in C#
Bahman Movaqar - Auto update the .NET core versions on your server
Bart Wullems - Preparing for the .NET 10 GC. In .NET 9 we enabled DATAS by default…
Maoni Stephens - Exploring Text-to-Image capabilities in .NET
Jeremy Likness - MassTransit and RabbitMQ in .NET: Building Fault-Tolerant Microservices
Sudhir Mangla - Some Thoughts on MS Pulling Back on their “Eventing Framework”
Jeremy D. Miller

Hace algún tiempo hablamos sobre el atributo [MemberNotNullWhen]
y vimos cómo se podía usar para mejorar la seguridad frente a valores nulos en nuestras aplicaciones.
Como recordaréis, este atributo lo aplicábamos sobre miembros booleanos para asegurar que otro miembro de su misma clase no contendrá null
, dependiendo del valor (true
o false
) del primero. El ejemplo que lo ilustraba era el siguiente:
public class Result<T>
{
[MemberNotNullWhen(true, nameof(Value))] // Si Success es true, Value no es null
[MemberNotNullWhen(false, nameof(Error))] // Si Success es false, Error no es null
public bool Success { get; init; }
public string? Error { get; init; }
public T? Value { get; init; }
// Constructores, factorías, etc
}
Pero también comentamos que existían muchos otros atributos que el compilador empleaba para afinar en la detección de posibles problemas similares en el código. Al usarlos, el compilador comprende mejor las intenciones de nuestro código respecto a la utilización de nulos, y puede generar advertencias que impiden posteriores errores en tiempo de ejecución, pero sólo cuando son estrictamente necesarias.
En este nuevo post, vamos a echar un vistazo a los siguientes:
[NotNullWhen]
[NotNullIfNotNull]
[MemberNotNull]

Vamos con una nueva colección de enlaces a contenidos de interés que he ido recopilando durante la última semana.
Destacamos, en primer lugar, el anuncio de que las versiones STS (Soporte a Largo Plazo) de .NET pasarán a tener 24 meses de soporte en lugar de los 18 actuales, comenzando ya con .NET 9. Una buena noticia para todos aquellos que preferimos estabilidad y no estar actualizando constantemente.
Interesante el post de Ali Hamza Ansari sobre el uso de "async void" en C# y por qué es peligroso, aunque también explica cuándo es aceptable usarlo.
A tener en cuenta asimismo el anuncio de la especificación final WebAssembly 3.0, que trae varios cambios importantes, como el direccionamiento de 64 bits, mejoras en gestión de la memoria y rendimiento, manejo de excepciones y otras.
Y Google ha anunciado Agent Payments Protocol (AP2), un protocolo abierto para facilitar el pago a través de agentes de IA de forme segura y verificable, buscando estandarizar el comercio automatizado 😱
En resto, a continuación.
Por si te lo perdiste...
- Renderizar componentes Blazor en vistas MVC (1/3): componentes estáticos (SSR)
José M. Aguilar - ¿Aún usas ToString() para obtener el nombre de los elementos de un enum?
José M. Aguilar
.NET
- .NET STS releases supported for 24 months
Jamshed Damkewala - Putting Lazy Tasks in a Cache, and Computing Only Once, When First Requested
Bryan Hogan - Writing your own batched sink in Serilog
Bart Wullems - Compress HttpClient requests with GZIP
Josef Ottosson - .NET 10 Release 1: Performance Boosts, Security Upgrades, and Smarter AI
DeeDee Walsh - Application Insights Code Optimizations for .NET Apps
Chuck Weininger - Supporting platform-specific .NET tools on old .NET SDKs
Andrew Lock - Demystifying async void in C#: Why It's Dangerous and When It's Okay
Ali Hamza Ansari - Migrating from XUnit v2 to v3
Bart Wullems - Moving off of TypeScript. We Love You, TypeScript
Chander Ramesh - Morse Code Messages with C#
Bryan Hogan - How to Generate Images in .NET 9
Mahesh Chand

Pues ya estamos aquí, inaugurando la nueva temporada con más de 80 enlaces a contenidos interesantes que he recopilado las semanas anteriores, entre los que hay bastante material para destacar 🙂
Empezamos por el post del equipo de NDepend, donde nos muestran la pinta que podrían tener los esperados tipos unión en C#. Todavía queda para verlos, llegarían con la versión 15 (noviembre de 2026), pero está bien echarles el ojo para interiorizarlos e ir descubriendo su potencia.
Seguimos con C#, porque el lenguaje que tanto usamos los desarrolladores .NET está cambiando. Andrew Lock explora los miembros de extensores de C# 14, una de las grandes novedades de la próxima versión de .NET (noviembre 2025).
Khalid Abuhakmeh aporta algunos trucos interesantes para optimizar la velocidad de carga en sitios ASP.NET Core, aunque los consejos en realidad son válidos para casi cualquier tecnología.
Vía Miguel Durán descubrimos el repositorio de Ásgeir Thor Johnson donde recopila los prompts de sistema de chatbots populares, como ChatGPT, Claude o Gemini. Aparte de lo curioso que resulta su lectura, lo más importante es que de momento no aparecen órdenes como "dominar a la humanidad" ni nada parecido, así que podemos estar tranquilos 😉
Interesante también el nuevo posicionamiento por anclaje en CSS que nos muestra Ahmad Shadeed, la propiedad position-anchor. Aunque aún no está disponible en todos los navegadores, está bien conocer su existencia porque proporciona una solución sencilla al habitual problema de ubicar un elemento respecto a la posición de otro.
Damos la bienvenida a Visual Studio 2026, aún en versión para insiders, pero que ya podemos probar. Mads Kristensen nos cuenta las novedades más importantes.
Estaba al caer, y ya llegó, el tradicional megapost de Stephen Toub sobre las mejoras de rendimiento en la próxima versión de .NET. Como siempre, muy interesante para conocer en qué se ha trabajado y qué podemos esperar de la próxima versión.
Chrome, el browser que cambió la forma de navegar por la web, acaba de cumplir 17 años, y Addy Osmani aprovecha para contarnos su origen, los objetivos que han guiado su evolución y los retos que afronta en la era de la IA.
Y muy loco el post de Lukas Vogel, que ha implementado DOOMQL, un juego de disparos multijugador al estilo DOOM, pero usando únicamente SQL. Sí, has leído bien, SQL.
El resto, a continuación...
Por si te lo perdiste...
- Renderizar componentes Blazor en vistas MVC (1/3): componentes estáticos (SSR)
José M. Aguilar - ¿Aún usas ToString() para obtener el nombre de los elementos de un enum?
José M. Aguilar
.NET
- Announcing .NET 10 Release Candidate 1
Rod Macdonald - The Hidden Gems of .NET 10: Lesser-Known Features That Will Transform Your Development
DeeDee Walsh - C# 14 extension members; AKA extension everything
Andrew Lock - GPT-OSS - A C# Guide with Ollama
Bruno Capuano - Converting an xUnit test project to TUnit
Andrew Lock - Enhance your CLI testing workflow with the new dotnet test
Mariam Abdullah - Nullable vs nullable in C#
Einar W. Høst. - C# 15 Unions
NDepend Team - The Value of Custom Exceptions
Peter Ritchie - Mastering Incremental Source Generators in C# Complete Guide
Ali Hamza Ansari - How to Hash Passwords with BCrypt in C#
Claudio Bernasconi - Using and authoring .NET tools
Andrew Lock - .NET HttpClient and Delegating Handlers
Khalid Abuhakmeh - Load Testing Microservices With C# and NBomber
Anton Martyniuk - Packaging self-contained and native AOT .NET tools for NuGet
Andrew Lock - Add API key authentication to an Minimal API endpoint
David Grace - Performance Improvements in .NET 10
Stephen Toub - C# Magical Syntax
Ricardo Peres

Hace pocas semanas vimos lo sencillo que era realizar esperas asíncronas usando el operador await
de C# sobre prácticamente cualquier tipo de objeto. Además de los ejemplos en los que trabajamos, una extensión interesante sería poder esperar hasta una fecha/hora concreta de forma concisa, por ejemplo así:
await Until(2025, 09, 15);
En este post, que además ejercerá de cierre oficial de la temporada, vamos a ver cómo podríamos hacer posible esto usando algunas características de C# que hemos visto en otros posts a lo largo del tiempo: directivas using
globales, uso de miembros estáticos y awaiters personalizados.
Para conseguirlo, en primer lugar debemos escribir un par de métodos estáticos relacionados sobre el tipo TimeSpan
:
- El primero de ellos, un método estático estándar al que llamaremos
Until()
, nos permitirá obtener el tiempo que falta hasta la fecha que le pasemos como parámetro. - El segundo, como vimos en el post anterior, es el extensor
GetAwaiter()
que nos permitirá usarawait
sobre el tipoTimeSpan
. Si queréis ver más detalles de esto, podéis volver a ojear dicho artículo.
El código podría ser el siguiente, en el archivo TimeSpanExtensions.cs
:
public static class TimeSpanExtensions
{
public static TimeSpan Until(int year, int month, int day,
int hour = 0, int minute = 0, int second = 0)
{
var targetDate = new DateTime(year, month, day, hour, minute, second);
return targetDate - DateTime.Now;
}
public static TaskAwaiter GetAwaiter(this TimeSpan value)
{
return Task.Delay(value).GetAwaiter();
}
}
Simplemente con añadir este clase a nuestro proyecto, pondremos a disposición de otros puntos el método Until()
para ser utilizado de la siguiente forma:
await TimeSpanExtensions.Until(2025, 09, 15);
Pero no era esto lo que queríamos, ¿verdad? Aquí es cuando entran en juego las directivas using
globales y el uso de miembros estáticos. Si insertamos en el archivo TimeSpanExtensions.cs
la siguiente directiva, la cosa cambiará bastante:
global using static TimeSpanExtensions;
... // La clase estática TimeSpanExtensions sigue igual
Con ese using static
hemos indicado al compilador que los métodos estáticos de la clase TimeSpanExtensions
estarán disponibles en todo el proyecto sin necesidad de referenciar explícitamente la clase. Esto hace posible que podamos usar directamente el método Until()
.
Pero además, al usar el modificador global
estamos haciendo que esa directiva se aplique a todo el proyecto, no solo al archivo actual. Esto significa que podemos usar Until()
en cualquier parte de nuestro código sin necesidad de añadir un using
específico en cada archivo.
Ahora, ya sí, podemos escribir el código de espera desde cualquier parte de nuestro proyecto:
await Until(2025, 09, 15);
¡Esto es todo! Y, con mucha alegría, aprovecho para informaros de que el blog estará en modo readonly hasta que acabe el await
, es decir, hasta mitad de septiembre de 2025 (semana arriba, semana abajo).
Durante este tiempo, intentaré desconectar un poco y disfrutar de algunas semanas de vacaciones, que faltita hacen. Espero que podáis hacer lo mismo, ¡nos veamos de nuevo a la vuelta, con las pilas bien cargadas!
Publicado en Variable not found.

En la última recopilación de enlaces de la temporada, destacamos un artículo de Chema Alonso hablando sobre el Ratio de Potemkin, una forma de medir cómo un LLM parece que entiende algo frente a su comprensión real.
Andrew Lock profundiza en los entresijos del funcionamiento del comando dotnet run app.cs
de .NET 10, que ayuda bastante a comprender lo que sucede tras bambalinas cuando lo lanzamos.
Filipe Lopes Domingues nos trae un artículo sobre la hidratación incremental en Angular, una técnica que mejora el rendimiento al reducir la cantidad de JavaScript necesario para cargar aplicaciones.
José Manuel Alarcón nos presenta las novedades de ECMAScript 2025, que incluyen mejoras significativas en el lenguaje JavaScript y sus aplicaciones prácticas.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- ¿Se puede usar System.IO para leer o escribir en el sistema de archivos desde Blazor WebAssembly? (Spoiler: sí, pero con matices)
José M. Aguilar - Cómo incluir scripts en la página desde vistas parciales ASP.NET Core MVC con DynamicSections
José M. Aguilar
.NET
- Behind the scenes of dotnet run app.cs
Andrew Lock - AutoMapper and MediatR Roadmaps
Jimmy Bogard - Getting Started With HotChocolate GraphQL For Building a Social Media Platform
Anton Martyniuk - Importing JSON Files Into A C# Project
Barret Blake - Functional Programming in C#—Exploring Advanced Topics
Assis Zang - Rejigs: Making Regular Expressions Human-Readable
Omar Zawahry

Estimados amigos y amigas:
Es un inmenso placer informaros de que Microsoft ha decidido honrarme de nuevo con el galardón MVP (Most Valuable Professional) por mis contribuciones a la comunidad de desarrolladores, en esta ocasión en las categorías de Desarrollo Web y .NET.
Es el decimoquinto año consecutivo en el que recibo este reconocimiento y aún no puedo evitar sentirme profundamente agradecido y afortunado por formar parte de una comunidad tan apasionada y generosa. Cada día es un privilegio poder compartir, aprender y crecer junto a todos vosotros.
Gracias de corazón a los que lo habéis hecho posible, por apoyarme y acompañarme en esta maravillosa etapa de mi vida.
Muchas gracias a los miembros del programa MVP @MVPAward, con la gran Cristina González (@crisgherrero), Program Manager en LATAM & Southern Europe, al frente, por considerarme merecedor de este galardón.
Muchas gracias también al resto de MVPs de Microsoft, por hacer una comunidad tan increíble y por todo lo que comparten con nosotros. Y enhorabuena a los que en estas mismas fechas han sido galardonados por primera vez, porque están viviendo un momento que no olvidarán.
Muchas gracias a mi familia, que me ha permitido dedicar tanto tiempo a mis aficiones y por su incondicional apoyo en todas mis aventuras.
Y, por supuesto, muchas gracias a todos los que me seguís a través de este blog u otros canales, porque sin vosotros nada de esto sería posible.
Ahora, ¡a celebrarlo! 😊🥳🎉🎆
Publicado en Variable not found.

Penúltima entrega de enlaces interesantes antes del parón vacacional, con más de cincuenta referencias a contenidos a los que vale la pena echar un vistazo.
Por destacar, en esta entrega, encontramos a Marc Rubiño hablando sobre cómo aplicar el enfoque ágil de las startups (probar pronto, equivocarse rápido y adaptarse), no sólo en el mundo de la tecnología. Y sobre todo, perder el miedo a equivocarnos.
Ricardo Peres hace una recopilación de tipos de colecciones presentes en la BCL de ,NET, y muestra las mejores prácticas a la hora de utilizarlas.
Chris Pietschmann nos recuerda la importancia de escribir código testeable, independientemente de que escribamos o no pruebas unitarias.
Y por último, echamos un vistazo en profundidad a las diferencias entre las funciones ordinarias y las funciones flecha en JavaScript, de la mano de James Sinclair.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- El operador 'with': mutaciones no destructivas en C#
José M. Aguilar - Redirecciones HTTP 303, 307 y 308: ¿las conoces?
José M. Aguilar
.NET
- Monitor your A/B test in .NET
Bart Wullems - Design Patterns Guide in .NET Using C# -Part II: Real-Time Project-Enterprise Notification System
Bhargava Koya - Testcontainers Best Practices for .NET Integration Testing
Milan Jovanović - Adding test description for data-driven tests in xUnit
Steven Giesel - Exploring the features of dotnet run app.cs
Andrew Lock - How to Find Public Symbols That Can Be Internal Using Roslyn
Gérald Barré - Evolving Text: Solving the “Hello World” Puzzle with a C# Genetic Algorithm
Chris Woodruff - .NET Collections
Ricardo Peres

El compilador de C# es listo, muy listo. Es capaz de analizar en tiempo real nuestro código para comprender lo que estamos haciendo y su contexto y, en muchas ocasiones, advertirnos de posibles errores antes de que seamos conscientes de que están ahí.
Pero lamentablemente aún no es adivino, y en algunas ocasiones tenemos que ayudarlo a que conozca nuestras intenciones. Para estos casos, existen una serie de atributos que añaden metadatos al código y que el compilador puede utilizar para realizar un análisis más preciso.
Hoy vamos a hablar de uno de estos atributos, MemberNotNullWhenAttribute
, que nos permite dar pistas al compilador sobre la nulabilidad de un miembro de una clase en función del valor de otro miembro, algo que puede resultarnos muy útil en ciertos escenarios, como veremos a continuación.

De alguna forma, los desarrolladores somos como relojeros: construimos sistemas complejos utilizando piezas diminutas que van encajando armoniosamente unas con otras para formar una máquina que funciona como un todo y aporta valor a nuestros usuarios. Quizás por eso me ha llamado la atención un precioso y trabajado artículo interactivo de Bartosz Ciechanowski, al que he llegado a través de MicroSiervos, sobre cómo funcionan los relojes mecánicos.
Continuando con la serie "cómo funcionan las cosas", Mia Koring nos explica cómo funciona la compresión de texto usando el algoritmo de codificación Huffman, uno de los muchos que existen para que nuestros datos ocupen menos espacio.
También esta semana, Martin Fowler ha publicado una reflexión, que comparto totalmente, sobre cómo los LLMs tienen la capacidad de redefinir lo que entendemos como "programación". De la misma forma que el ensamblador nos alejó de los ceros y unos, o los lenguajes de alto nivel nos fueron aislando cada vez más de la máquina permitiéndonos jugar con abstracciones superiores, los LLMs son una capa de abstracción aún mayor, que incluso nos permite alejarnos de los detalles de implementación y centrarnos más en la lógica y el diseño de alto nivel... eso sí, a costa de la indeterminación. Un artículo muy interesante que no te puedes perder.
Por último, me ha alegrado leer en el post de David Ortinau que .NET 10 va a reducir la verbosidad del XAML usado en páginas y componentes MAUI, algo que siempre me ha parecido más farragoso de la cuenta... sobre todo cuando vienes de la web y usas sintaxis superconcisas como Razor.
El resto de contenidos interesantes recopilados la semana pasada, a continuación.
Por si te lo perdiste...
- Un ejemplo de uso elegante del operador "null coalescing assignment" de C#
José M. Aguilar - Extendiendo claims de usuarios en ASP.NET Core
José M. Aguilar
.NET
- Wire Up XUnit Logging for Crazy Integration Testing
Jeremy D. Miller - Legacy Code Survival Guide: Visual Basic and .NET in 2025
DeeDee Walsh - Task.WhenAll or Parallel.ForEach?
Fati Iseni - Day 11: Implementing a C# Mutation Operator for Genetic Algorithms
Chris Woodruff - Managing Secrets in .NET Applications with Azure Key Vault & Managed Identities
Sudhir Mangla - .NET 8.0.17 Upgrades, Forwarded Headers, and Unknown Proxy Issues
Khalid Abuhakmeh & Wesley Cabus - .NET Channels as a In-Memory Message Bus – Beware!
Derek Comartin

Estamos acostumbrados a usar el operador await
de C# para esperar la finalización de tareas asíncronas representadas por objetos de tipo Task
, Task<T>
, ValueTask
o ValueTask<T>
, pero, ¿sabíais que en realidad podemos usarlo con cualquier tipo de objeto?.
En este artículo vamos a ver que es bastante sencillo, y lo ilustraremos con un ejemplo muy simple: cómo esperar un segundo usando la expresión await 1000
o await TimeSpan.FromSeconds(1)
en lugar del clásico await Task.Delay(1000)
.

Una vez más, vamos con los contenidos interesantes recopilados durante la semana pasada 🙂
En esta ocasión, me vais a permitir a destacar un post propio que, aunque tiene más de un año de vida y es bastante básico, creo sigue siendo muy válido y puede ser de ayuda para algunos desarrolladores que siguen malgastando recursos. En "¡No uses ContainsKey()
en un diccionario .NET para ver si existe un elemento antes de obtenerlo!" demostramos de forma empírica lo absurdo de realizar una comprobación de existencia de un elemento en un diccionario .NET antes de obtenerlo, un detalle en los que a veces no caemos.
También destacaremos algunos contenidos relacionados con MCP, que sin duda es la palabra de moda de los últimos tiempos. Primero, Aaron Stannard nos cuenta en qué consiste este estándar y para qué podamos usarlo en la práctica, eliminando el hype que le rodea.
Juan Luis Guerrero continúa explorando la implementación y uso de servidores MCP, esta vez usando como modelo Google Gemini 2.5.
Rhea Patel nos cuenta que el modo agente ya está disponible de forma general en Visual Studio.
Y el equipo de Visual Studio Code ha publicado un catálogo de servidores MCP listos para usar en el modo agente del editor, instalables con un único click.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- ¡No uses ContainsKey() en un diccionario .NET para ver si existe un elemento antes de obtenerlo!
José M. Aguilar - Renderizar una vista Razor a un string en ASP.NET Core MVC
José M. Aguilar
.NET
- .NET 10 Performance Edition
Steven Giesel - Song recommendations from C# combinators
Mark Seemann - Getting started with Open Telemetry in .NET with Jaeger and Seq
Anton Martyniuk - 16 common mistakes C#/.NET developers make (and how to avoid them)
Ali Hamza Ansari - Temporal.IO in .NET
Marek Sirkovský - RunJS: An MCP server that lets LLMs generate and execute JavaScript safely in an embedded .NET runtime sandbox using the Jint library.
Charles Chen - 7 Underrated C# 12 and C# 13 Features Every Developer Should Know!
Saravanan Madheswaran - Kickstarting your libraries with the .NET Library Starter Kit Dennis Doomen
Dennis Doomen - How to use frozen collections in C#
Joydip Kanjilal - Unpacking Zip Folders into Windows Long File Paths
Rick Strahl

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
.

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