Lorsque vous traitez des structures, vous avez affaire à des types de valeur.
Dans une classe, "this" est une référence à l'instance actuelle. Cela vous permet de faire muter l'instance de classe en définissant les propriétés/champs de la classe. Cependant, si vous êtes dans une structure, les choses agissent différemment. Lorsque vous êtes dans la méthode d'une structure, "this" vous permet de faire muter la structure. Cependant, si vous utilisez ceci dans une méthode, vous avez presque toujours affaire à une copie de la structure "originale".
Par exemple:
struct Test
{
int i;
void Mutate() {
this.i += 1;
}
}
Lorsque vous utilisez ceci:
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
}
Maintenant, la partie étrangère - ceci est valable, et ce que cette citation a dit:
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
je me sentais une grande perturbation dans la Force, comme si des millions de voix criaient soudainement de terreur et appelaient à la correction correcte. Merci de ne pas montrer cela à mes collègues C++. :-) –
Eh, const en C++ est un mensonge. En C++, const signifie souvent "je promets de ne pas changer cette chose", et non "j'ai la garantie que cette chose est immuable". –
Bel exemple Jon. Voici ce que vous démontrez, bien que la structure puisse être immuable, la * variable * qui contient la structure ne l'est pas. Cette variable peut encore varier; C'est pourquoi cela s'appelle une variable. C'est juste un moyen particulièrement horrible de le faire varier. –