Saya ingin menambahkan bahwa: Memanggil GC.Collect () (+ WaitForPendingFinalizers ()) adalah salah satu bagian dari cerita. Seperti yang disebutkan dengan benar oleh orang lain, GC.COllect () adalah kumpulan non-deterministik dan diserahkan kepada kebijaksanaan GC itu sendiri (CLR). Meskipun Anda menambahkan panggilan ke WaitForPendingFinalizers, itu mungkin tidak bersifat deterministik. Ambil kode dari tautan msdn ini dan jalankan kode dengan iterasi loop objek sebagai 1 atau 2. Anda akan menemukan apa arti non-deterministik (menetapkan titik putus di destruktor objek). Tepatnya, destruktor tidak dipanggil ketika hanya ada 1 (atau 2) objek yang tersisa oleh Wait .. (). [Citation reqd.]
Jika kode Anda berurusan dengan sumber daya yang tidak terkelola (mis .: pegangan file eksternal), Anda harus menerapkan destruktor (atau finalizer).
Berikut ini contoh yang menarik:
Catatan : Jika Anda sudah mencoba contoh di atas dari MSDN, kode berikut akan membersihkan udara.
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 = "";
}
}
Saya sarankan, pertama analisis apa outputnya dan kemudian jalankan dan kemudian baca alasannya di bawah ini:
{Destruktor hanya dipanggil secara implisit setelah program berakhir. } Untuk membersihkan objek secara deterministik, seseorang harus mengimplementasikan IDisposable dan membuat panggilan eksplisit ke Dispose (). Itulah intinya! :)