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

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

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

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

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

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