Chào các bạn,
Kỳ trước, khi còn học lập trình hướng sự kiện, Thầy Lê Hữu Dũng có nói về kiểu giá trị với tham chiếu gì đó mình lại không để ý vì nghĩ nó không quan trọng lắm. Nhưng khi thực tập tại OTSC, bắt tay vào làm các dự án thực tế mình mới thấy được tầm quan trọng và mức độ ảnh hưởng của nó.
Về kiểu giá trị theo mình hiểu là tất cả các kiểu giá trị nguyên thủy (primitive type). vd: int, float, double, long, bool,...
Khi chúng ta khai báo một biến kiểu giá trị máy sẽ cấp một vùng nhớ mới để lưu trữ giá trị. Chính vì vậy, khi ta gán giá trị cho biến, giá trị sẽ được lưu trữ trực tiếp vào vùng nhớ đã cấp phát đó
Khác với value type, reference type không trực tiếp lưu giá trị trên bộ nhớ mà chỉ lưu trữ địa chỉ của biến. Điều này được hiểu là khi ta khai báo 1 biến B rồi gán B = biến A. Thì cả B và A đều được trỏ đến cùng một địa chỉ lưu trữ. Về mặt nhận biết đâu là reference type, ta có thể coi tất cả các kiểu dữ liệu/cấu trúc có thể khởi tạo bằng từ khóa new thì là kiểu tham chiếu.
Ví dụ: Sinhvien sv = new Sinhvien(); // sv chính là một biến kiểu tham chiếu.
Để hiểu rõ hơn, mình có ví dụ như sau:
Sinhvien svGioinhat = arrSinhvien[0]; //svGioinhat.Diem = 8.4
float diemCaonhat = arrSinhvien[0].Diem
//Làm tròn điểm của sinh viên
arrSinhvien[0].Diem = 8
//Chạy đến đây, ta sẽ nhận được kết quả: svGioinhat.Diem = 8. còn diemCaonhat vẫn = 8.4
//Mà không còn giữ được giá trị svGioinhat.Diem = 8.4 đã lấy riêng trước khi xử lý nữa.
//Vì cả svGioinhat và arrSinhvien[0] cùng được trỏ đến cùng một địa chỉ lưu trữ khác với biến diemCaonhat là value type
Trên đây là những nội dung áp dụng với C#, theo mình thì trên các ngôn ngữ lập trình khác (java, c/c++,...) cũng có những nguyên lý tương tự. Mời các bạn cho ý kiến chia sẻ về sự khác nhau, khám phá mới về vấn đề này trên .NET cũng như các công nghệ khác.
