2009-11-07 39 views
54

Tôi nghĩ rằng GC sẽ gọi Dispose cuối cùng nếu chương trình của bạn không nhưng bạn nên gọi Dispose() trong chương trình của bạn chỉ để làm cho xác định dọn dẹp.Bộ thu gom rác có gọi là Dispose() không?

Tuy nhiên, từ chương trình thử nghiệm nhỏ của tôi, tôi không nhìn thấy vứt nhận được gọi là gì cả ....

public class Test : IDisposable 
{ 
    static void Main(string[] args) 
    { 
     Test s = new Test(); 
     s = null; 
     GC.Collect(); 
     Console.ReadLine(); 
    } 

    public Test() 
    { 
     Console.WriteLine("Constructor"); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

// Output chỉ là "Constructor", tôi không nhận được "Vứt" như tôi mong đợi. Chuyện gì thế?

EDIT: Có, tôi biết tôi nên gọi Dispose() - Tôi làm theo mẫu chuẩn khi sử dụng các đối tượng dùng một lần. Câu hỏi của tôi nảy sinh bởi vì tôi đang cố gắng theo dõi sự rò rỉ trong mã của ai đó, được quản lý bằng C++ (một lớp phức tạp khác có thể là chủ đề tốt của một chủ đề khác).

+0

Câu hỏi này là bản sao của [http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for -me] (http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for-me). –

Trả lời

50

GC không gọi Dispose, nó gọi trình hoàn thiện của bạn (bạn nên gọi số Dispose(false)).

Hãy nhìn vào các bài viết liên quan trên mặt hoặc tìm kiếm các thông lệ C# tốt nhất cho mô hình Dispose (Các docs on IDisposable giải thích nó khá tốt IIRC.)

+4

Tên là "finializer", có lẽ không may là C# sử dụng cú pháp tương tự như một trình phá hủy C++. –

+1

Quyền, làm cho ngôn ngữ của tôi bị nhầm lẫn ở đây. – Eloff

+4

Cần lưu ý rằng mặc định * Finalizer * không làm gì cả. Xem thêm: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight