Quando hai a che fare con le strutture, hai a che fare con i tipi di valore.
In una classe, "questo" è un riferimento all'istanza corrente. Ciò consente di mutare l'istanza della classe impostando proprietà/campi sulla classe.
Tuttavia, se ci si trova in una struttura, le cose si comportano in modo diverso. Quando sei nel metodo di una struct, "this" ti permette di mutare la struttura. Tuttavia, se stai usando questo metodo, hai quasi sempre a che fare con una copia della struttura "originale".
Ad esempio:
struct Test
{
int i;
void Mutate() {
this.i += 1;
}
}
Quando si utilizza questa:
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
}
Ora, la parte sconosciuto - questo è valido, e ciò che quella citazione stava dicendo:
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
fonte
2009-09-09 14:39:41
ho sentito una grande interferenza nella Forza, come se milioni di voci improvvisamente gridavano nel terrore e chiedevano la correttezza costante. Per favore non mostrare questo ai miei colleghi C++. :-) –
Eh, const in C++ è una bugia. In C++, const significa spesso "Prometto di non cambiare questa cosa", e non "Ho la garanzia che questa cosa sia immutabile". –
Bel esempio Jon. Qui quello che stai dimostrando è che sebbene la struttura possa essere immutabile, la * variabile * che contiene la struttura non lo è. Quella variabile può ancora variare; è per questo che ha chiamato una variabile. Questo è solo un modo particolarmente orribile per farlo variare. –