Dường như mọi cuốn sách .NET đều nói về các loại giá trị so với các loại tham chiếu và làm cho nó trở thành một trạng thái (thường không chính xác) trong đó mỗi loại được lưu trữ - heap hoặc ngăn xếp. Thông thường nó trong một vài chương đầu tiên và được trình bày như một sự thật quan trọng.
Tôi hoàn toàn đồng ý; Tôi thấy điều này tất cả các thời gian.
Tại sao sách .NET nói về stack vs heap memory memory?
Một phần lý do là vì nhiều người đã đến C # (hoặc các ngôn ngữ .NET khác) từ nền C hoặc C ++. Vì các ngôn ngữ đó không áp dụng cho bạn các quy tắc về thời gian lưu trữ, nên bạn phải biết các quy tắc đó và thực hiện chương trình của mình một cách cẩn thận để tuân theo chúng.
Bây giờ, biết các quy tắc đó và tuân theo chúng trong C không yêu cầu bạn phải hiểu "đống" và "ngăn xếp". Nhưng nếu bạn hiểu cách các cấu trúc dữ liệu hoạt động thì thường dễ hiểu và tuân theo các quy tắc hơn.
Khi viết một cuốn sách dành cho người mới bắt đầu, việc tác giả giải thích các khái niệm theo thứ tự mà họ đã học là điều đương nhiên. Đó không nhất thiết là thứ tự có ý nghĩa cho người dùng. Gần đây tôi là biên tập viên kỹ thuật cho cuốn sách dành cho người mới bắt đầu C # 4 của Scott Dorman, và một trong những điều tôi thích là Scott đã chọn một thứ tự khá hợp lý cho các chủ đề, thay vì bắt đầu từ những chủ đề thực sự tiên tiến trong quản lý bộ nhớ.
Một phần khác của lý do là một số trang trong tài liệu MSDN nhấn mạnh mạnh vào việc cân nhắc lưu trữ. Đặc biệt tài liệu MSDN cũ hơn vẫn còn lảng vảng từ những ngày đầu. Phần lớn tài liệu đó có những lỗi tinh vi chưa bao giờ được cắt bỏ, và bạn phải nhớ rằng nó được viết vào thời điểm cụ thể trong lịch sử và cho một đối tượng cụ thể.
Tại sao stack vs heap thậm chí quan trọng đối với các nhà phát triển .NET (người mới bắt đầu)?
Theo tôi, nó không. Điều quan trọng hơn nhiều để hiểu là những thứ như:
- Sự khác biệt về ngữ nghĩa sao chép giữa loại tham chiếu và loại giá trị là gì?
- Làm thế nào để một tham số "ref int x" hoạt động?
- Tại sao các loại giá trị là bất biến?
Và như vậy.
Bạn phân bổ công cụ và nó chỉ hoạt động, phải không?
Đó là lý tưởng.
Bây giờ, có những tình huống trong đó nó có vấn đề. Bộ sưu tập rác là tuyệt vời và tương đối rẻ tiền, nhưng nó không miễn phí. Sao chép các cấu trúc nhỏ xung quanh là tương đối rẻ tiền, nhưng không miễn phí. Có những kịch bản hiệu suất thực tế trong đó bạn phải cân bằng chi phí của áp lực thu gom so với chi phí sao chép quá mức. Trong những trường hợp đó, rất hữu ích để có một sự hiểu biết mạnh mẽ về kích thước, vị trí và tuổi thọ thực tế của tất cả các bộ nhớ có liên quan.
Tương tự, có các kịch bản xen kẽ thực tế, trong đó cần phải biết những gì trên ngăn xếp và những gì trên đống, và những gì người thu gom rác có thể di chuyển xung quanh. Đó là lý do tại sao C # có các tính năng như "cố định", "stackalloc", v.v.
Nhưng đó là tất cả các kịch bản nâng cao. Lý tưởng nhất là một lập trình viên mới bắt đầu cần lo lắng về những thứ này.