2010-09-06 31 views
7

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

14

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.

+0

+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

+0

Từ tuyệt vời. Đã được thêm bài viết vào đánh dấu – zerkms

+1

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ý. –

2

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.

3

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

+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 –

3

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ĩ -

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

+0

Liên kết bị hỏng, bạn có thể vui lòng cập nhật không? – DSF

1

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.

0

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.

Các vấn đề liên quan