Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

19 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 3 de marzo de 2026
Dos personas conectadas a una máquina para cambiar su identidad

Vamos con una entrega más (siete llevamos ya) de la serie C# bizarro, estos divertidos posts donde ponemos a prueba nuestros conocimientos del lenguaje mientras exploramos algunas de sus características extrañas o poco conocidas.

En esta ocasión, os propongo que le echéis un vistazo al siguiente código, en especial a su método ChangeIdentity(), que pretende cambiar la identidad de una persona por la de otra que le llega como parámetro:

var john = new Person() { Name = "John" };
var peter = new Person() { Name = "Peter" };

john.ChangeIdentity(peter);
Console.WriteLine(john.Equals(peter));

struct Person
{
    public string Name;

    public void ChangeIdentity(Person otherPerson)
    {
        this = otherPerson; // WFT!?!?
    }
}

En efecto, en el cuerpo del método estamos asignando un nuevo valor a this. ¿Pensáis que esto compilará? Y en caso afirmativo, ¿qué veríamos en la consola al ejecutarlo, true o false?

Deteneos un poco en el código y pensad en la respuesta, que, aunque tiene algo de truco, seguro que podéis encontrarla porque no es muy retorcida. Pero si se resiste o no lo tenéis claro, siempre podréis pulsar aquí para leer la solución 👇👇

El código, efectivamente, compila sin problema. Aunque la asignación de this pueda parecer extraña, es perfectamente válida en C# porque estamos en el interior del método de instancia de una estructura. No compilaría, en cambio, si Person fuera una clase.

Esto se debe a que internamente las estructuras son tipos valor, por lo que this representa una copia completa del valor de la estructura en memoria. Al asignar this = otherPerson, estamos copiando el valor de otherPerson sobre this, lo que en la práctica significa que estamos copiando el valor de todos los campos de la estructura origen sobre la actual, aunque sin tener que hacerlo de forma manual 🙂

En clases, sin embargo, this es una referencia (o puntero) inmutable a la instancia del objeto en memoria, por lo que no se puede reasignar para ponerla apuntando a otro objeto.

Ahora vamos con la segunda parte de la pregunta, ¿qué veremos en la consola al ejecutar el código que utiliza el método ChangeIdentity()?

var john = new Person() { Name = "John" };
var peter = new Person() { Name = "Peter" };

john.ChangeIdentity(peter);
Console.WriteLine(john.Equals(peter));

Seguro que habéis adivinado que la respuesta es true. Fijaos que si hubiésemos utilizado clases en lugar de estructuras, el resultado habría sido false, ya que john y peter serían punteros a objetos distintos en memoria y la igualdad por referencia nunca sería cierta. Pero al ser estructuras, la comprobación de igualdad se realiza por valor, es decir, comparando los valores de todos sus campos.

Y dado que anteriormente hemos copiado los valores de todos los campos de peter sobre la estructura john, ambos objetos son idénticos en memoria y, por tanto, la operación de comparación devuelve true.

Qué, ¿lo habíais adivinado? 😄

Publicado en Variable not found.

lunes, 2 de marzo de 2026
Desarrollador bastante desesperado mientras depura un código

Una semana más, vamos con los enlaces a contenidos interesantes que he ido recopilando durante estos días, entre los que destaco algunos posts.

Juan Irigoyen comparte sus experiencias utilizando IA para optimizar SQL Server, en un interesante recorrido por la preparación de un agente Claude capaz de analizar y optimizar consultas SQL, con resultados bastante prometedores.

La depuración puede ser una labor compleja, intensa, a veces frustrante y otras gratificante, pero sin duda forma parte de nuestro día a día. En este artículo, Jeremy D. Miller reflexiona sobre el proceso de depuración, compartiendo consejos para abordar los problemas de manera efectiva-

Y para terminar, una frikada épica a la que llego a través de Microsiervos: un procesador x86 completo implementado únicamente con CSS, sin una sola línea de código JavaScript, y que es capaz de ejecutar código ensamblador compilado para ese procesador.

El resto de contenidos interesantes, a continuación.

Por si te lo perdiste...

.NET

lunes, 23 de febrero de 2026
Desarrollador trabajando concentrado mientras alrededor pasan muchas cosas

Otra semana de contenidos interesantes en la web 🙂

Según Milan Milanović, solo 3–4 horas al día son realmente productivas al programar, porque el resto del tiempo se pierde por límites cognitivos, reuniones e interrupciones. Si conseguimos optimizar ese tiempo, mejorará nuestro rendimiento y la calidad del software que desarrollemos, mucho más que intentar trabajar más horas.

Bruno Capuano nos habla sobre la generación de embeddings, tanto de texto como de imágenes, en nuestro equipo local, y nos presenta una biblioteca de código abierto que ha desarrollado para facilitar esta tarea en .NET.

¿En qué se diferencian las colecciones Readonly de las Immutables? ¿Y qué son las colecciones Frozen? Pues aunque parezcan lo mismo, Davide Bellone nos muestra que son cosas muy diferentes.

La primera preview de .NET 11 ya trae algunas novedades interesantes. Steven Giesel nos muestra que el nuevo runtime async es una realidad, y que va a mejorar mucho el rendimiento de las aplicaciones asíncronas.

El resto de enlaces a contenidos interesantes, a continuación.

Por si te lo perdiste...

.NET

martes, 17 de febrero de 2026
Una lambda petrificada

No es algo que se utilice habitualmente, y a veces incluso es un detalle desconocido por los desarrolladores, pero las funciones lambda de C# pueden ser estáticas. Y no es porque sea algo nuevo, pues esta característica se introdujo en la versión 9.0 del lenguaje en 2020... simplemente son esos pequeños detalles que se van añadiendo al lenguaje sin hacer mucho ruido, y que a veces pasan desapercibidos.

De hecho, el uso de lambdas estáticas puede ayudarnos a escribir un código más seguro y predecible, además de tener cierto impacto en el rendimiento de nuestras aplicaciones, por lo que merece la pena conocerlas y saber cuándo y cómo usarlas.

En este post vamos a ver qué son las lambdas estáticas, cómo se implementan y cuándo y por qué deberíamos usarlas.

lunes, 16 de febrero de 2026
Desarrollador senior recordando cómo era programar cuarenta años atrás

Mucho contenido interesante en la recopilación de enlaces de esta semana, entre los que me gustaría destacar algunas lecturas a las que, como mínimo, vale la pena echar un vistazo.

Ha llegado la primera preview de .NET 11, con un buen puñado de novedades en el runtime, librerías, SDK, C#, ASP.NET y Blazor. En el post del anuncio oficial podéis encontrar el listado completo y enlaces para profundizar en cada una de ellas.

Tenemos un doblete de Ricardo Peres sobre Entity Framework Core. Primero, profundiza en la forma de mapear distintos tipos de relaciones y las novedades que se han introducido en las últimas versiones para facilitar esta tarea, y luego nos habla sobre la validación de estado de entidades en este framework.

GitHub Copilot es indudablemente una herramienta alucinante, pero a veces no es fácil saber qué modo de uso es el más adecuado para cada tarea. José Manuel Alarcón nos lo explica en este artículo

Y siguiendo con dobletes, el mismo autor nos trae un interesante artículo analizando cómo determinadas narrativas negativas amplificadas en redes sociales pueden generar frustración y malas decisiones en desarrolladores júnior, y propone estrategias prácticas para reconocer ese sesgo y protegerse de él.

Por último, James Randall comparte cómo ha cambiado la programación en 40 años y cómo ha cambiado también su relación con ella. Si tienes ya unos añitos, probablemente te sentirás identificado.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET

lunes, 9 de febrero de 2026
Agente OpenClaw realizando distintas tareas mientras el usuario hace crucigramas

En los enlaces interesantes de esta semana, creo que vale la pena destacar el post de Peter Steinberger anunciando OpenClaw, el nuevo nombre de Moltbot, que a su vez fue un nuevo nombre para Clawd. En cualquier caso, una plataforma abierta que, con sus luces y sus sombras, ha traído aire fresco al mundo de los agentes personales inteligentes alojados en nuestra propia infraestructura.

También, gracias a Kevin W. Griffin, esta semana he descubierto la función COUNT(*) OVER() de SQL Server, que permite obtener el número total de filas en una consulta sin necesidad de hacer una consulta previa adicional, muy útil para paginación de datos.

Teresa Torres, por su parte, ha publicado un post muy interesante explicando cómo funciona ChatGPT, con un lenguaje bastante más accesible para humanos "normales" que lo que solemos encontrar por la red.

Por último, David Grace nos recuerda que nuestras excepciones pueden exponer información sensible que podría ser utilizada por algún desalmado, y cómo evitarlo utilizando herramientas proporcionadas por ASPNET Core.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET