Stack và Heap trong C# – Hiểu rõ cách hoạt động bộ nhớ

Stack và Heap trong C# – Hiểu rõ cách hoạt động bộ nhớ

June 11, 2025 0 By Nam Vu

Để bắt đầu tìm hiểu về Stack và Heap trong C#, trước tiên chúng ta cần nắm được hai khái niệm quan trọng: Value Type (kiểu giá trị) và Reference Type (kiểu tham chiếu). Hai loại này được phân biệt dựa trên cách mà chúng lưu trữ dữ liệu trong bộ nhớ.

Value Type – Kiểu giá trị

Kiểu giá trị là những kiểu dữ liệu mà giá trị của biến được lưu trữ trực tiếp trong bộ nhớ của chính biến đó. Nói cách khác, mỗi biến kiểu giá trị có bản sao riêng biệt.

Các đặc điểm chính của Value Type:

  • Dữ liệu được lưu trữ trực tiếp trong vùng nhớ của biến.
  • Khi truyền biến kiểu giá trị vào phương thức, một bản sao mới được tạo ra.
  • Do đó, việc thay đổi giá trị của bản sao sẽ không ảnh hưởng đến biến gốc.
  • Bộ nhớ được sử dụng để lưu trữ kiểu giá trị là Stack.
  • Một số ví dụ về Value Type bao gồm: int, float, bool, char, decimal, enum, struct, double, short, long, v.v.

Reference Type – Kiểu tham chiếu

Trái ngược với Value Type, Reference Type không lưu trữ trực tiếp giá trị của biến. Thay vào đó, nó lưu trữ địa chỉ trong Stack – nơi trỏ tới dữ liệu thực sự trong Heap.

Đặc điểm của Reference Type:

  • Biến lưu giữ địa chỉ đến vùng nhớ chứa dữ liệu, thay vì dữ liệu thực sự.
  • Khi truyền biến Reference Type vào phương thức, cả hai biến sẽ cùng trỏ đến một địa chỉ trong Heap.
  • Do đó, nếu thay đổi dữ liệu thông qua một biến, biến còn lại cũng bị ảnh hưởng.
  • Sử dụng cả Stack và Heap trong quá trình lưu trữ.
  • Các kiểu dữ liệu như class, object, string, array là những ví dụ tiêu biểu cho Reference Type.

Lưu ý: Mặc dù string là Reference Type, nhưng nó lại immutable (bất biến). Khi gán một giá trị mới cho biến string, hệ thống không thay đổi nội dung chuỗi hiện tại mà tạo ra một chuỗi mới trong bộ nhớ và cập nhật con trỏ trỏ đến vị trí mới đó. Vì vậy, việc thay đổi giá trị không làm ảnh hưởng đến chuỗi ban đầu.

Stack – Bộ nhớ ngăn xếp

Stack là một cấu trúc dữ liệu tuyến tính tuân theo nguyên tắc LIFO (Last-In-First-Out) – phần tử được thêm vào cuối cùng sẽ được lấy ra đầu tiên. Đây là nơi lưu trữ các biến kiểu giá trị và thông tin thực thi của các hàm.

Các đặc điểm của Stack:

  • Phân bổ bộ nhớ tĩnh.
  • Truy cập nhanh, nhưng dung lượng hạn chế.
  • Dùng để lưu trữ biến cục bộ, tham số truyền vào và lời gọi hàm.
  • Biến được xóa khỏi Stack ngay khi phương thức thực thi xong.
  • Tất cả dữ liệu trong Stack đều có thời gian sống ngắn hạn và chỉ tồn tại trong phạm vi phương thức.

Heap – Bộ nhớ vùng cấp phát động

Heap là khu vực bộ nhớ nơi dữ liệu được cấp phát một cách động trong thời gian chạy. Đây là nơi lưu trữ các đối tượng và dữ liệu của Reference Type.

Đặc điểm của Heap:

  • Phân bổ bộ nhớ động, nghĩa là cấp phát khi cần thiết.
  • Có thể truy cập từ bất kỳ đâu trong chương trình, không bị giới hạn phạm vi như Stack.
  • Tốc độ truy cập chậm hơn Stack, nhưng linh hoạt và có thể lưu trữ nhiều dữ liệu hơn.
  • Bộ nhớ không được giải phóng tự động ngay khi phương thức kết thúc, mà phụ thuộc vào Garbage Collector để thu hồi.

Hiểu rõ sự khác biệt giữa Stack và Heap cũng như giữa Value Type và Reference Type là điều rất quan trọng để quản lý bộ nhớ hiệu quả trong C#. Stack nhanh hơn nhưng bị giới hạn về dung lượng, trong khi Heap có khả năng lưu trữ lớn hơn nhưng đi kèm với chi phí quản lý bộ nhớ và hiệu suất. Khi sử dụng đúng cách, bạn có thể tận dụng tối đa sức mạnh của bộ nhớ trong ứng dụng .NET của mình.

Cảm ơn bạn đã đọc!

#ntechdevelopers