En C#, solemos pensar que this es una entidad inmutable dentro de un objeto: podés usarlo para leer, pero jamás para asignar. Eso es cierto… salvo que estés trabajando con un struct. Y ahí es donde empieza lo interesante.
En clases, intentar escribir this = otraInstancia; es un error de compilación. Pero en structs, esa línea es válida, y en algunos casos, incluso útil.
¿Por qué? Porque un struct es un tipo de valor. Cuando estás dentro de un método de instancia de un struct, this es una referencia a una copia de la instancia, y podés reasignarla.
Veamos un ejemplo básico
struct Punto
{
public int X;
public int Y;
public void Reiniciar()
{
this = new Punto(0, 0); // reemplaza toda la instancia
}
}
Este método Reiniciar reemplaza completamente el contenido del struct por uno nuevo.
¿Y esto para qué sirve? A veces, en vez de ir campo por campo, simplemente querés decir:
Ya fue, esta instancia no me sirve, la reescribo entera.
Por ejemplo:
struct Usuario
{
public string Nombre;
public string Email;
public void Vaciar()
{
this = default; // equivalente a new Usuario()
}
}
C# 9 introdujo record struct, y con eso también podemos usar el patrón with, lo que abre otras posibilidades:
public readonly record struct Coordenada(int X, int Y)
{
public Coordenada Mover(int dx, int dy)
{
return this with { X = this.X + dx, Y = this.Y + dy };
}
}
¿Y si no querés devolver una nueva instancia? Podés mutar así:
public record struct Contador(int Valor)
{
public void Incrementar()
{
this = this with { Valor = Valor + 1 };
}
}
- Esto solo funciona en structs, no en clases.
- Al reasignar this, perdés todo el estado anterior.
- No es común en código idiomático de C#, así que usalo con intención y claridad.
La asignación a this en structs es uno de esos detalles de C# que sorprenden. No es algo que debas usar todo el tiempo, pero saber que existe puede ayudarte a escribir código más claro en ciertos contextos.
La próxima vez que necesites reiniciar por completo una instancia de un struct, acordate:
Sí, podés decir this = ... y nadie te lo va a impedir.