Trong các kiểu của .NET Framework chúng ta có 2 kiểu là Value Type (kiểu tham trị) và Reference Type (kiểu tham chiếu).
- Kiểu tham trị lưu trực tiếp dữ liệu trong bộ nhớ Stack
- Kiểu tham chiếu chỉ lưu địa chỉ trong Stack còn giá trị biến nằm ở nơi khác (Heap)
Kiểu tham trị (Value Type)
Một kiểu tham trị lưu nội dung của nó trong bộ nhớ cấp phát là Stack. Khi chúng ta tạo một biến kiểu tham trị thì một vùng nhớ sẽ được cấp phát để lưu giá trị của biến một cách trực tiếp.
Nếu bạn gán nó cho một biến khác thì giá trị sẽ được copy trực tiếp và cả 2 biến sẽ làm việc độc lập.
Các kiểu dữ liệu tham trị trong .NET:
- Các kiểu số nguyên
- Kiểu số thực
- Kiểu logic bool
- Kiểu ký tự char
- Kiểu struct
- Enum
Kiểu tham chiếu
Kiểu tham chiếu được dùng để lưu một giá trị tham chiếu (địa chỉ ô nhớ) của một đối tượng nhưng không lưu trữ đối tượng đó.
Bởi vì kiểu tham chiếu chỉ lưu địa chỉ của ô nhớ của biến thay vì lưu giá trị của biến, nên khi gán một biến tham chiếu cho một biến khác thì nó không copy data mà nó chỉ copy địa chỉ tham chiếu.
Nên cả 2 biến sẽ cùng tham chiếu đến một địa chỉ giống nhau trên bộ nhớ Heap.
Điều này có nghĩa khi một biến tham chiếu không được dùng nữa, nó sẽ được đánh dấu cho Garbage collection.
Các kiểu dữu liệu tham chiếu:
- Classs
- Object
- Array
- Indexer
- Interface
Bộ nhớ Stack và Heap
Stack là bộ nhớ cấp phát tĩnh còn Heap là bộ nhớ cấp phát động, cả 2 đều được lưu trữ trên RAM của máy tính.
Bạn có thể dùng Stack nếu bạn biết chắc độ lớn của dữ liệu cần lưu trước khi biên dịch chương trình, nó không được quá lớn.
Bạn có thể dùng heap nếu bạn không biết chính xác độ lớn dữ liệu bạn sẽ cần ở lúc chạy hoặc nếu bạn cần cấp phát rất nhiều dữ liệu.
Trong ứng dụng mutilple thread, mỗi một thread sẽ có một stack riêng nhưng chúng sẽ chia sẻ bộ nhớ heap. Stack là riêng cho từng thread còn heap là chia sẻ cho toàn ứng dụng.
So sánh giữa Stack và Heap
Stack |
Heap |
Bộ nhớ được quản lý tự động |
Bộ nhớ được quản lý bằng tay |
Kích cỡ nhỏ |
Kích cỡ lớn |
Truy cập dễ dàng và nhanh chóng, dễ dàng cache |
Khó cache vì bị phân tán trong bộ nhớ |
Không linh hoạt, bộ nhớ cấp phát không thể thay đổi |
Lich hoạt, bộ nhớ cấp phát có thể đổi |
Giới hạn trong phạm vi thread |
Được truy cập toàn bộ ứng dụng |
Hệ điều hành cấp phát stack khi thread được tạo |
Hệ điều hành được gọi bởi ngôn ngữ lúc chạy ứng dụng để cấp phát heap cho ứng dụng. |
So sánh cấp phát tĩnh và cấp phát động
Cấp phát tĩnh |
Cấp phát động |
Kích thước phải biết lúc biên dịch |
Không biết kích thước biến lúc biên dịch |
Thực hiện lúc biên dịch |
Thực hiện lúc runtime |
Được gán cho stack |
Gán cho heap |
FILO (First – in, last- out) |
Không có thứ tự |
Tóm lại
Chúng ta có 2 kiểu dữ liệu là tham trị và tham chiếu:
- Tham trị là các kiểu dữ liệu kích thước nhỏ, size cố định giá trị lưu trực tiếp trên bộ nhớ Stack.
- Tham chiếu là kiểu chỉ lưu địa chỉ trên stack và giá trị lưu trên heap.
- Cả 2 loại bộ nhớ này đều được lưu trên RAM, nó chỉ là khác vùng thôi. Một bên là cấp phát tĩnh 1 bên là cấp phát động.
Tại sao lại phải chia ra thế?
Vì với kiểu dữ liệu lớn, như là object thì không thể biết kích thước của nó lúc biên dịch nên không lưu trên stack mà chỉ lưu địa chỉ của Heap thôi, vì heap là bộ nhớ cấp phát động.
Ví dụ: Ta có đọc 1 cuốn sách Harry Porter, thay vì tôi nói tôi đã đọc cuốn sách Harry Porter 1 thì tôi phải nói là Tôi đọc …. từ câu đầu cho đến câu cuối…bạn có biết không? Thay vì chúng ta phải nêu ra toàn bộ nội dung cuốn sách rất dài thì ta chỉ cần refer đến tên cuốn sách, chính là địa chỉ ô nhớ trỏ đến nội dung cuốn sách. Còn cuốn sách có nội dung như thế nào thì bạn đó sẽ tự tìm đọc.
Còn những câu văn ngắn thì chúng ta có thể nói luôn trong cuộc trò chuyện. Ví dụ: Bạn ăn cơm chưa? Thì câu đó không nằm trong cuốn sách nào hoặc nó rất ngắn nên có thể nói luôn trong cuộc hội thoại.
Đó là kiểu tham trị.
Video:
Tác giả: Bạch Ngọc Toàn
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.