Đây là một cách hay để suy nghĩ về sự khác biệt giữa các loại giá trị, chuyển qua giá trị, loại tham chiếu và chuyển qua tham chiếu:
Một biến là một container.
Một biến kiểu giá trị chứa một thể hiện. Một biến kiểu tham chiếu chứa một con trỏ tới một thể hiện được lưu trữ ở nơi khác.
Sửa đổi một biến loại giá trị làm thay đổi thể hiện mà nó chứa. Sửa đổi một biến kiểu tham chiếu làm thay đổi thể hiện mà nó trỏ tới.
Các biến kiểu tham chiếu riêng biệt có thể trỏ đến cùng một thể hiện. Do đó, cùng một thể hiện có thể được thay đổi thông qua bất kỳ biến nào trỏ đến nó.
Đối số được truyền qua giá trị là một vùng chứa mới với một bản sao mới của nội dung. Đối số được thông qua tham chiếu là vùng chứa ban đầu với nội dung ban đầu của nó.
Khi đối số loại giá trị được truyền qua giá trị: Việc gán lại nội dung của đối số không có tác dụng ngoài phạm vi, bởi vì vùng chứa là duy nhất. Sửa đổi đối số không có tác dụng ngoài phạm vi, vì thể hiện là một bản sao độc lập.
Khi một đối số kiểu tham chiếu được truyền theo giá trị: Việc gán lại nội dung của đối số không có tác dụng ngoài phạm vi, bởi vì vùng chứa là duy nhất. Sửa đổi nội dung của đối số ảnh hưởng đến phạm vi bên ngoài, vì con trỏ được sao chép trỏ đến một thể hiện được chia sẻ.
Khi bất kỳ đối số nào được truyền qua tham chiếu: Việc gán lại nội dung của đối số sẽ ảnh hưởng đến phạm vi bên ngoài, vì vùng chứa được chia sẻ. Sửa đổi nội dung của đối số ảnh hưởng đến phạm vi bên ngoài, vì nội dung được chia sẻ.
Tóm lại là:
Một biến chuỗi là một biến kiểu tham chiếu. Do đó, nó chứa một con trỏ tới một thể hiện được lưu trữ ở nơi khác. Khi truyền qua giá trị, con trỏ của nó được sao chép, do đó sửa đổi đối số chuỗi sẽ ảnh hưởng đến thể hiện được chia sẻ. Tuy nhiên, một thể hiện chuỗi không có thuộc tính có thể thay đổi, do đó, một đối số chuỗi không thể được sửa đổi. Khi được truyền qua tham chiếu, vùng chứa của con trỏ được chia sẻ, do đó việc gán lại vẫn sẽ ảnh hưởng đến phạm vi bên ngoài.