Kiedy masz do czynienia ze strukturami, masz do czynienia z typami wartości.
W klasie "this" jest odniesieniem do bieżącej instancji. Pozwala to zmutować instancję klasy przez ustawienie właściwości/pól na klasie.
Jednakże, jeśli jesteś w strukturze, rzeczy działają inaczej. Kiedy używasz metody struct, "to" pozwala ci zmutować strukturę. Jeśli jednak używasz tego w metodzie, prawie zawsze masz do czynienia z kopią "oryginalnej" struktury.
Na przykład:
struct Test
{
int i;
void Mutate() {
this.i += 1;
}
}
Podczas korzystania z tego:
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
}
Teraz część obcy - to jest ważne, a co to cytat mówił:
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
Poczułem wielką zakłócenia w Mocy, jak jeśli miliony głosów nagle krzyknęły z przerażenia i wzywały do stałej poprawności. Nie pokazuj tego moim współpracownikom w C++. :-) –
Eh, const w C++ to kłamstwo. W języku C++ const często oznacza "obiecuję nie zmieniać tego", a nie "mam gwarancję, że to coś jest niezmienne". –
Przyjemny przykład Jon. W tym przykładzie demonstruje, że struktura może być niezmienna, ale zmienna *, która zawiera strukturę, nie jest. Ta zmienna wciąż może się różnić; dlatego nazywa się zmienną. Jest to szczególnie okropny sposób na różnicowanie. –