Tôi hơi bối rối về việc sử dụng hàm hủy trong C#. Theo hiểu biết của tôi, chúng tôi không thể gọi theo thứ tự mong muốn của tôi, nó sẽ tự động gọi trước bộ thu gom rác để thực hiện một số công việc trên lớp (đối tượng) vì vậy tôi muốn hỏi xem chúng ta có đang sử dụng destructor trong C# hay không. Như tôi biết rằng destructor có thể chăm sóc bộ nhớ thì tại sao chúng ta cần phải thu gom rác thải?Sử dụng hàm hủy trong C#?
Trả lời
Everybody thinks about garbage collection the wrong way:
Một chương trình một cách chính xác bằng văn bản không thể giả định rằng finalizers bao giờ sẽ chạy.
Trình hủy không dành cho việc xóa bộ nhớ được quản lý. Đó là những gì các nhà sưu tập rác là cho. Các destructor là để làm sạch các tài nguyên khác như xử lý.
Tôi khuyên bạn nên xem CLR via C# để biết chi tiết về cách hoạt động của tính năng này.
Tôi nghĩ dựa trên việc đọc số almost duplicate topic của bạn mà bạn không hiểu rõ cách Trình thu thập rác hoạt động như thế nào. Một cách rất ngắn gọn và ngắn gọn, nó là dịch vụ riêng của nó chạy ẩn, nó theo dõi và giải phóng bộ nhớ cho các đối tượng không được sử dụng và xử lý trong suốt toàn bộ vòng đời của ứng dụng của bạn. Thực tế, bạn nên không bao giờ phải tự gọi GC, trừ khi trong trường hợp rất hiếm và cụ thể.
Bộ giải mã được sử dụng để làm sạch và miễn phí tài nguyên không được quản lý không thể được giải phóng bởi Bộ thu gom rác, xem MSDN page này để biết thêm thông tin về destructors.
+1 để nói to rằng lời khuyên tốt nhất có thể là để hiểu rõ về quản lý bộ nhớ, thu gom rác và tài nguyên gốc/vứt bỏ trong .NET –
Sẽ hữu ích khi đọc về cách chính xác để triển khai mẫu IDisposable. Có nhiều hơn nữa để nó hơn những gì chúng ta nghĩ -
Liên kết bị hỏng, bạn có thể vui lòng cập nhật không? – DSF
Tôi nghĩ sự nhầm lẫn ở đây xuất phát từ thực tế là bạn có thể vứt bỏ các đối tượng cả về mặt xác định lẫn không xác định (tức là khi GC xoay vòng để thực hiện).
Để trả lời các câu hỏi của bạn tại sao chúng tôi cần một GC, tôi có thể nói rằng, thậm chí đặt sang một bên rò rỉ bộ nhớ, các GC là khá hiệu quả, và có yêu cầu lấy lại bộ nhớ ngay lập tức thực sự có thể làm giảm tổng hiệu suất của hệ thống. Một đối số tương tự của nó đối với cuộc tranh luận đa luồng và đa luồng.
Các cấu trúc trong C# nên được sử dụng rất hiếm khi. Tuy nhiên, trong một số trường hợp, bạn không có lựa chọn nào khác.
Ví dụ, nếu bạn có một lớp đơn để ghi nhật ký và từ các lý do hiệu suất bạn không thể sử dụng tính năng tự động quét, hãy xóa một bộ đệm trong khi hoàn thành bản đơn.
- 1. Sử dụng hàm c_str Trong C++
- 2. Phải cung cấp hàm hủy trong PIMPL
- 3. Sử dụng C# Count() với hàm
- 4. C++ "chức năng ảo nhưng không có hàm hủy ảo"
- 5. Làm cách nào để sử dụng hàm round() trong C?
- 6. Sử dụng các hàm min và max trong C++
- 7. Cách nào để sử dụng hàm rand() trong C++?
- 8. Làm thế nào để bạn sử dụng "C" bên ngoài để gọi hàm C++ trong C
- 9. Tại sao hàm hủy python được gọi?
- 10. Sử dụng hàm tạo trong một cuộc gọi hàm?
- 11. Sử dụng :: trong C++
- 12. Sử dụng -> trong khai báo hàm
- 13. sử dụng chức năng C trong C#
- 14. C++ hiểu cocos2d-x sử dụng các con trỏ hàm
- 15. Sử dụng C# đại biểu có hàm f #
- 16. gọi hàm java từ c bằng cách sử dụng jni
- 17. Tôi có thể sử dụng tham chiếu bên trong hàm C# như C++ không?
- 18. sử dụng một hàm trong file .c khác nhau (c lập trình 101)
- 19. Hủy bỏ khoảng trắng trong Python sử dụng string.whitespace
- 20. Cách sử dụng hàm calc() bên trong một hàm khác
- 21. Hàm main() trong C
- 22. C++ ngăn xếp đối tượng được phân bổ, gọi hàm hủy rõ ràng
- 23. TypeLoadException đã bị hủy trong C#
- 24. Cách sử dụng hàm bulkInsert() trong android?
- 25. Sử dụng _ trong các hàm lambda scala
- 26. Sử dụng hàm generate_series sql() trong redshift
- 27. sử dụng hàm tạo riêng trong lớp
- 28. Sử dụng stringstream bên trong hàm ostream
- 29. Sử dụng auto trong một hàm lambda
- 30. Sử dụng đối số hàm trong update.formula
+1 Khá nhiều câu trả lời hay nhất cho đến nay và câu trả lời duy nhất thực sự chính xác. Tốt nhất, bạn đặt một cuộc gọi đến Dipose() trong finalizer của bạn, trong trường hợp Dispose() không được gọi bằng tay bởi mã khác trong chương trình của bạn. – siride
Từ tuyệt vời. Đã được thêm bài viết vào đánh dấu – zerkms
Ngoài ra bài viết được liên kết bởi Unmesh là một nguồn tài nguyên rất thần, http://msdn.microsoft.com/en-us/magazine/cc163392.aspx.Có rất nhiều bài viết khác trên web đề cập đến mẫu 'Vứt bỏ (bool disposing)' thực sự giải thích sự khác biệt giữa tài nguyên 'gốc' và 'được quản lý'. Tôi đã nhìn thấy rất nhiều một lớp học không cần thiết thực hiện các mô hình để xử lý * tài nguyên * quản lý. –