Oto dobry sposób na zastanowienie się nad różnicą między typami wartości, przekazywaniem przez wartość, typami odwołań i przekazywaniem przez odwołanie:
Zmienna to kontener.
Zmienna typu wartości zawiera instancję. Zmienna typu referencyjnego zawiera wskaźnik do instancji przechowywanej w innym miejscu.
Modyfikacja zmiennej typu wartości powoduje mutację wystąpienia, które zawiera. Modyfikacja zmiennej typu odwołania powoduje mutację wystąpienia, na które wskazuje.
Oddzielne zmienne typu referencyjnego mogą wskazywać na to samo wystąpienie. Dlatego ta sama instancja może zostać zmutowana za pomocą dowolnej zmiennej, która na nią wskazuje.
Argument przekazany przez wartość to nowy kontener z nową kopią zawartości. Argument przekazany przez odwołanie to oryginalny kontener z oryginalną zawartością.
Gdy argument typu wartości jest przekazywany przez wartość: ponowne przypisanie zawartości argumentu nie ma skutku poza zakresem, ponieważ kontener jest unikalny. Modyfikacja argumentu nie ma skutku poza zakresem, ponieważ instancja jest niezależną kopią.
Gdy argument typu odwołania jest przekazywany według wartości: ponowne przypisanie zawartości argumentu nie ma wpływu poza zakresem, ponieważ kontener jest unikalny. Modyfikacja zawartości argumentu wpływa na zakres zewnętrzny, ponieważ skopiowany wskaźnik wskazuje na współdzielone wystąpienie.
Gdy jakikolwiek argument jest przekazywany przez odwołanie: ponowne przypisanie zawartości argumentu ma wpływ na zakres zewnętrzny, ponieważ kontener jest współużytkowany. Modyfikacja treści argumentu wpływa na zakres zewnętrzny, ponieważ zawartość jest udostępniana.
Podsumowując:
Zmienna łańcuchowa jest zmienną typu referencyjnego. Dlatego zawiera wskaźnik do instancji przechowywanej w innym miejscu. Po przekazaniu przez wartość jego wskaźnik jest kopiowany, więc modyfikacja argumentu ciągu powinna wpływać na współdzielone wystąpienie. Jednak wystąpienie ciągu nie ma modyfikowalnych właściwości, więc argument ciągu nie może zostać zmodyfikowany. Po przekazaniu przez odwołanie kontener wskaźnika jest współużytkowany, więc ponowne przypisanie nadal będzie miało wpływ na zakres zewnętrzny.