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.

Aún no hay comentarios, ¡sé el primero!