
Te propongo un experimento: abre un documento en blanco con el block de notas y anota todas las unidades de medida de CSS que se te ocurran (por ejemplo, px, em, etc.) Luego, cuéntalas... ¿cuántas has recordado? Yo nueve, entre las que había una inventada 😕 Por eso me ha llamado la atención el artículo de Nikolaus Gebhardt en el que recopila las ¡42! unidades de medida que define CSS.
Una lectura de interés también el artículo Ricardo Peres explica cómo restringir el acceso a un método de acción en ASP.NET Core MVC utilizando el filtro [Authorize]
, atributos de autorización personalizados, políticas y otros mecanismos proporcionados por el framework.
Por último, Juan Irigoyen nos muestra una metodología práctica para generar código con IA usando prompts estructurados en formato Markdown.
El resto de contenidos interesantes recopilados durante la semana pasada, a continuación.
Por si te lo perdiste...
- C# bizarro, episodio 5: ¿cuál es la salida de este código?
José M. Aguilar - El filtro [ApiController] en ASP.NET Core MVC
José M. Aguilar
.NET
- Rx.NET v6.1 Now Available
Ian Griffiths - What .NET 10 GC Changes Mean for Developers
Roxeem - Introducing XAML.io Preview v0.5— Visual .NET Development, Instantly in Your Browser
OpenSilver - No More Mocking ILogger
Adam Storr - Use CancellationTokens
Steven Giesel - xUnit advanced Assert methods: Throws, IsType + more
David Grace - .NET 10: The Deathblow to Python’s AI Dominance?
DeeDee Walsh - Interesting new C# 14 features coming with .NET 10
Thomas Levesque - The 3 C# PDF Libraries Every Developer Must Know
Anton Martyniuk - Modern .NET or .NET Framework: Which Should Developers Choose in 2025?
Jeyasri Murugan - Automatic Mappings with AutoMapper
Ricardo Peres - How to Find an Available Network Port for a server in .NET
Gérald Barré - Announcing a new OData.NET serializer
Erik Ejlskov Jensen - Pass the State
Szymon Kulec - TUnit — A Pragmatic Evaluation for .NET Teams
Martin Stühmer
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces

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!

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