Cuando se trata de estructuras, se trata de tipos de valores.
En una clase, "esto" es una referencia a la instancia actual. Esto le permite mutar la instancia de clase estableciendo propiedades/campos en la clase.
Sin embargo, si estás en una estructura, las cosas actúan de manera diferente. Cuando estás en el método de una estructura, "esto" te permite mutar la estructura. Sin embargo, si estás usando esto en un método, casi siempre estás tratando con una copia de la estructura "original".
Por ejemplo:
struct Test
{
int i;
void Mutate() {
this.i += 1;
}
}
Cuando se utiliza esta:
void MutateTest(Test instance)
{
instance.Mutate();
}
{
Test test = new Test();
test.i = 3;
Console.WriteLine(test.i); // Writes 3
test.Mutate(); // test.i is now 4
Console.WriteLine(test.i); // Writes 4
MutateTest(test); // MutateTest works on a copy.. "this" is only part of the copy itself
Console.WriteLine(test.i); // Writes 4 still
}
Ahora, la parte desconocido - esto es válido, y lo que esa cita estaba diciendo:
struct Test
{
public Test(int value)
{
this.i = value;
}
int i;
void Mutate(int newValue) {
this = new Test(newValue); // This wouldn't work with classes
}
}
///
{
Test test = new Test();
test.i = 3;
Console.WriteLine(test.i); // Writes 3
test.Mutate(4);
Console.WriteLine(test.i); // Writes 4
me sentí una gran perturbación en la Fuerza, como si millones de voces gritaban aterrorizadas y pedían una const corrección. Por favor, no mostrar esto a mis compañeros de trabajo de C++. :-) –
Eh, const en C++ es una mentira. En C++, const significa a menudo "Prometo no cambiar esta cosa", y no "tengo la garantía de que esto sea inmutable". –
Buen ejemplo Jon. Aquí lo que está demostrando es que aunque la estructura puede ser inmutable, la * variable * que contiene la estructura no lo es. Esa variable aún puede variar; es por eso que se llama una variable. Esta es solo una manera particularmente horrible de hacer que varíe. –