Tôi đã lớp sauSử dụng IDisposable để hủy đăng ký sự kiện-- Tôi có cần đặt những thứ khác vào mục đích không?
public class Presenter: IDisposable
{
public IView View
{get;private set;}
//snip other object reference, all managed
public Presenter(IView view)
{
View=view;
View.MouseUp += MouseUpEvent;
}
public void MouseUpEvent()
{
//do whatever you want to do on mouse up
}
public void Dispose()
{
View.MouseUp -= MouseUpEvent;
// no more manual disposing
}
}
Câu hỏi đặt ra bây giờ là, tôi thực hiện Dispose()
phương pháp chính xác? Hoặc tôi có cần phải xử lý thủ công tất cả các đối tượng được quản lý khác chỉ vì tôi đã xác định rõ ràng Dispose()
?
Tôi cho rằng GC đủ thông minh để tự xử lý (trừ đăng ký sự kiện) ngay cả khi tôi không thực hiện thủ công. Tôi có đúng không?
Tôi không nghĩ mình cần nó. Tôi chấp nhận câu trả lời của bạn về Einstein bởi vì tôi thấy bạn dễ hiểu hơn (không phải mọi sinh tử đều có thể hiểu Einstein :)). – Graviton
Nếu không có chủ đề, tôi hiểu rằng nếu lớp đó không bị niêm phong, bạn nên * có một finalizer (như trường hợp với Component) ngay cả khi bạn không nắm giữ tài nguyên không được quản lý bởi vì lớp con có thể và không nên phải biết liệu lớp cơ sở có chịu trách nhiệm gọi Dispose (bool) tại finalization hay không. Nhưng như tôi đã nói tôi đang rời khỏi chủ đề. – Josh
@Josh: Tôi tin rằng nếu bạn cần một finalizer trong lớp của bạn, bạn nên thực hiện một và gọi 'Dispose (false)'. 'Dispose' phải được gọi nhiều lần. Điều này là tốt hơn so với việc tải các lớp với các finalizers không cần thiết. Finalizers nên hiếm trong những ngày này (với 'SafeHandle' et al) nhưng họ có một chi phí thực sự thực sự liên kết với họ. –