ฉันอยากจะเพิ่มว่า: การเรียก GC.Collect () (+ WaitForPendingFinalizers ()) เป็นส่วนหนึ่งของเรื่องราว ดังที่ผู้อื่นกล่าวไว้อย่างถูกต้อง GC.COllect () เป็นคอลเล็กชันที่ไม่ได้กำหนดและให้อยู่ในดุลยพินิจของ GC เอง (CLR) แม้ว่าคุณจะเพิ่มการเรียกไปยัง WaitForPendingFinalizers แต่ก็อาจไม่สามารถกำหนดได้ รับโค้ดจากลิงก์ msdn นี้และรันโค้ดด้วยการวนซ้ำของออบเจ็กต์เป็น 1 หรือ 2 คุณจะพบว่าความหมายที่ไม่ใช่ปัจจัยกำหนด (กำหนดจุดพักในตัวทำลายวัตถุ) อย่างแม่นยำไม่ได้เรียกตัวทำลายล้างเมื่อมีวัตถุค้างอยู่เพียง 1 (หรือ 2) ชิ้นโดย Wait .. () [อ้างอิง reqd.]
หากโค้ดของคุณจัดการกับทรัพยากรที่ไม่มีการจัดการ (เช่นตัวจัดการไฟล์ภายนอก) คุณต้องใช้ตัวทำลาย (หรือตัวสุดท้าย)
นี่คือตัวอย่างที่น่าสนใจ:
หมายเหตุ : หากคุณได้ลองใช้ตัวอย่างข้างต้นจาก MSDN แล้วรหัสต่อไปนี้จะทำการล้างอากาศ
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 = "";
}
}
ฉันขอแนะนำให้วิเคราะห์ก่อนว่าผลลัพธ์จะเป็นอย่างไรจากนั้นจึงเรียกใช้จากนั้นอ่านเหตุผลด้านล่าง:
{ตัวทำลายจะถูกเรียกโดยปริยายเมื่อโปรแกรมสิ้นสุดเท่านั้น } ในการทำความสะอาดออบเจ็กต์อย่างกำหนดได้เราต้องใช้ IDisposable และทำการเรียกอย่างชัดเจนไปที่ Dispose () นั่นคือสาระสำคัญ! :)