Ось хороший спосіб подумати про різницю між типами значень, типами передачі за значенням, типами посилань та посиланням:
Змінна - контейнер.
Змінна типу типу містить примірник. Змінна типу посилання містить вказівник на екземпляр, який зберігається в іншому місці.
Змінення змінної типу значення мутує екземпляр, який вона містить. Змінення змінної типу посилання мутує екземпляр, на який він вказує.
Окремі змінні типу опорного типу можуть вказувати на один і той же екземпляр. Тому той самий екземпляр можна мутувати за допомогою будь-якої змінної, яка вказує на нього.
Аргумент переданого значення - це новий контейнер з новою копією вмісту. Аргумент, що передається через посилання - це оригінальний контейнер з його оригінальним вмістом.
Коли аргумент типу значення передається за значенням: Переназначення вмісту аргументу не має ефекту поза сферою, оскільки контейнер унікальний. Змінення аргументу не має ефекту поза сферою, оскільки екземпляр є незалежною копією.
Коли аргумент опорного типу передається за значенням: Перепризначення вмісту аргументу не має ефекту поза сферою, оскільки контейнер унікальний. Змінення вмісту аргументу впливає на зовнішню область, оскільки скопійований покажчик вказує на спільний екземпляр.
Коли будь-який аргумент передається через посилання: Перепризначення вмісту аргументу впливає на зовнішню область застосування, оскільки контейнер є спільним. Змінення вмісту аргументу впливає на зовнішню область застосування, оскільки вміст є спільним.
На закінчення:
Строкова змінна - це змінна типу опорного типу. Тому він містить вказівник на екземпляр, який зберігається в іншому місці. Коли передається значення, його вказівник копіюється, тому зміна аргументу рядка має впливати на спільний екземпляр. Однак, рядковий екземпляр не має змінних властивостей, тому аргумент рядка не можна змінювати. При передачі посилання контейнер вказівника розділяється, тому переназначення все одно вплине на зовнішню область застосування.