Sự khác biệt giữa các loại tham chiếu và các loại giá trị về cơ bản là một sự đánh đổi hiệu suất trong thiết kế ngôn ngữ. Các loại tham chiếu có một số chi phí xây dựng và phá hủy và thu gom rác, vì chúng được tạo ra trên đống. Mặt khác, các loại giá trị có phí trên các cuộc gọi phương thức (nếu kích thước dữ liệu lớn hơn một con trỏ), vì toàn bộ đối tượng được sao chép chứ không chỉ là một con trỏ. Vì các chuỗi có thể (và thường là) lớn hơn nhiều so với kích thước của một con trỏ, nên chúng được thiết kế dưới dạng các kiểu tham chiếu. Ngoài ra, như Servy đã chỉ ra, kích thước của một loại giá trị phải được biết tại thời điểm biên dịch, điều này không phải lúc nào cũng đúng với các chuỗi.
Câu hỏi về tính đột biến là một vấn đề riêng biệt. Cả hai loại tham chiếu và loại giá trị có thể là đột biến hoặc bất biến. Các loại giá trị thường không thay đổi, vì ngữ nghĩa cho các loại giá trị có thể thay đổi có thể gây nhầm lẫn.
Các loại tham chiếu thường có thể thay đổi, nhưng có thể được thiết kế là bất biến nếu nó có ý nghĩa. Các chuỗi được định nghĩa là bất biến bởi vì nó làm cho tối ưu hóa nhất định có thể. Ví dụ, nếu cùng một chuỗi ký tự xảy ra nhiều lần trong cùng một chương trình (khá phổ biến), trình biên dịch có thể sử dụng lại cùng một đối tượng.
Vậy tại sao "==" bị quá tải để so sánh các chuỗi theo văn bản? Bởi vì nó là ngữ nghĩa hữu ích nhất. Nếu hai chuỗi bằng nhau bằng văn bản, chúng có thể hoặc không thể là cùng một tham chiếu đối tượng do tối ưu hóa. Vì vậy, so sánh các tài liệu tham khảo là khá vô ích, trong khi so sánh văn bản hầu như luôn luôn là những gì bạn muốn.
Nói một cách tổng quát hơn, String có những gì được gọi là ngữ nghĩa giá trị . Đây là một khái niệm tổng quát hơn các loại giá trị, là một chi tiết triển khai cụ thể của C #. Các loại giá trị có ngữ nghĩa giá trị, nhưng các loại tham chiếu cũng có thể có ngữ nghĩa giá trị. Khi một loại có ngữ nghĩa giá trị, bạn thực sự không thể biết liệu triển khai cơ bản là loại tham chiếu hay loại giá trị, vì vậy bạn có thể xem đó là chi tiết triển khai.
is
các thử nghiệm sang một bên), câu trả lời có lẽ là "vì lý do lịch sử". Hiệu suất sao chép không thể là lý do vì không cần sao chép vật lý bất biến. Bây giờ không thể thay đổi mà không vi phạm mã thực sự sử dụngis
kiểm tra (hoặc các ràng buộc tương tự).