Tôi muốn nói thêm rằng: Gọi GC.Collect () (+ WaitForPendingFinalizers ()) là một phần của câu chuyện. Như những người khác đã đề cập đúng đến, GC.COllect () là tập hợp không xác định và được để theo quyết định của chính GC (CLR). Ngay cả khi bạn thêm lệnh gọi vào WaitForPendingFinalizers, nó có thể không xác định được. Lấy mã từ liên kết msdn này và chạy mã với phép lặp vòng lặp đối tượng là 1 hoặc 2. Bạn sẽ tìm thấy ý nghĩa không xác định (đặt điểm ngắt trong bộ hủy của đối tượng). Chính xác, hàm hủy không được gọi khi chỉ có 1 (hoặc 2) đối tượng còn sót lại bởi Wait .. (). [Citation reqd.]
Nếu mã của bạn đang xử lý tài nguyên không được quản lý (ví dụ: xử lý tệp bên ngoài), bạn phải triển khai trình hủy (hoặc trình hoàn thiện).
Đây là một ví dụ thú vị:
Lưu ý : Nếu bạn đã thử ví dụ trên từ MSDN, đoạn mã sau sẽ xóa không khí.
class Program
{
static void Main(string[] args)
{
SomePublisher publisher = new SomePublisher();
for (int i = 0; i < 10; i++)
{
SomeSubscriber subscriber = new SomeSubscriber(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(SomeSubscriber.Count.ToString());
Console.ReadLine();
}
}
public class SomePublisher
{
public event EventHandler SomeEvent;
}
public class SomeSubscriber
{
public static int Count;
public SomeSubscriber(SomePublisher publisher)
{
publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
}
~SomeSubscriber()
{
SomeSubscriber.Count++;
}
private void publisher_SomeEvent(object sender, EventArgs e)
{
// TODO: something
string stub = "";
}
}
Tôi đề nghị, trước tiên hãy phân tích đầu ra có thể là gì, sau đó chạy và sau đó đọc lý do bên dưới:
{Hàm hủy chỉ được gọi ngầm sau khi chương trình kết thúc. } Để làm sạch đối tượng một cách xác định, người ta phải triển khai IDisposable và thực hiện một lệnh gọi rõ ràng tới Dispose (). Đó là bản chất! :)