Berikut cara yang baik untuk memikirkan perbedaan antara tipe-nilai, passing-by-value, tipe-referensi, dan passing-oleh-referensi:
Variabel adalah wadah.
Variabel tipe nilai berisi instance. Variabel tipe referensi berisi pointer ke instance yang disimpan di tempat lain.
Memodifikasi variabel tipe-nilai bermutasi instance yang dikandungnya. Memodifikasi variabel tipe referensi bermutasi contoh yang menunjuk.
Variabel tipe referensi yang terpisah dapat menunjuk ke instance yang sama. Oleh karena itu, instance yang sama dapat dimutasi melalui variabel apa pun yang menunjuk ke sana.
Argumen lewat-nilai adalah wadah baru dengan salinan konten yang baru. Argumen lulus-oleh-referensi adalah wadah asli dengan konten aslinya.
Ketika argumen tipe nilai diteruskan oleh nilai: Menugaskan kembali konten argumen tidak berpengaruh di luar cakupan, karena wadah itu unik. Mengubah argumen tidak berpengaruh di luar cakupan, karena instance adalah salinan independen.
Ketika argumen tipe referensi diteruskan oleh nilai: Menugaskan kembali konten argumen tidak memiliki pengaruh di luar ruang lingkup, karena wadah itu unik. Memodifikasi konten argumen memengaruhi lingkup eksternal, karena penunjuk yang disalin menunjuk ke instance bersama.
Ketika ada argumen yang dilewatkan oleh referensi: Menugaskan kembali konten argumen mempengaruhi ruang lingkup eksternal, karena wadah dibagikan. Memodifikasi konten argumen memengaruhi lingkup eksternal, karena konten dibagikan.
Kesimpulannya:
Variabel string adalah variabel tipe referensi. Oleh karena itu, ini berisi pointer ke instance yang disimpan di tempat lain. Ketika diteruskan oleh nilai, penunjuknya disalin, jadi memodifikasi argumen string harus memengaruhi instance yang dibagikan. Namun, turunan string tidak memiliki sifat yang dapat diubah, sehingga argumen string tidak dapat dimodifikasi. Ketika lulus-oleh-referensi, wadah pointer dibagikan, sehingga penugasan kembali masih akan mempengaruhi lingkup eksternal.