Pola event, jebakan (kebocoran memori)
Kenali dan perbaiki jebakan event: berhenti berlangganan untuk mencegah kebocoran memori, simpan referensi delegate untuk menghapusnya, dan gunakan pola langganan IDisposable.
Pola event, jebakan (kebocoran memori) adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.
Ikhtisar jebakan
Tujuan: Gunakan peristiwa dengan aman.
- Berhenti berlangganan untuk mencegah kebocoran memori
- Simpan referensi ke penangan yang sama agar dapat menghapusnya
- Utamakan pola IDisposable sederhana untuk pembersihan
- Hindari penangan anonim sebaris yang tidak dapat dilepas
Berhenti berlangganan untuk mencegah kebocoran
Peristiwa menyimpan referensi ke pelanggan. Jika penerbit hidup lama dan Anda tidak pernah melepasnya, pelanggan tidak dapat dikumpulkan.
using System;
public class Publisher
{
public event EventHandler Tick;
public void Fire()
{
EventHandler h = Tick;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Subscriber
{
public void Handle(object s, EventArgs e)
{
Console.WriteLine("Handling tick");
}
public void Subscribe(Publisher p) { p.Tick += Handle; }
public void Unsubscribe(Publisher p) { p.Tick -= Handle; } // required to avoid leaks
}
public class Program
{
public static void Main(string[] args)
{
Publisher p = new Publisher();
Subscriber s = new Subscriber();
s.Subscribe(p);
p.Fire(); // prints once
s.Unsubscribe(p); // detach when done
s = null; // now eligible for GC in a real app
p.Fire(); // no output
}
}
Simpan referensi penangan
Untuk melepas penangan anonim, simpan penangan tersebut dalam variabel dan teruskan instans yang sama ke -=.
using System;
public class Button
{
public event EventHandler Click;
public void Simulate()
{
EventHandler h = Click;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Button b = new Button();
// BAD: cannot easily remove this later
// b.Click += (s, e) => Console.WriteLine("inline");
// GOOD: store the handler, attach, later detach the same instance
EventHandler saved = (s, e) => Console.WriteLine("saved");
b.Click += saved;
b.Simulate(); // prints "saved"
b.Click -= saved; // can remove because we kept the reference
b.Simulate(); // no output
}
}
Langganan yang dapat dibuang
Kembalikan IDisposable dari Subscribe. Gunakan pernyataan using untuk berhenti berlangganan secara otomatis.
using System;
public class Ticker
{
public event EventHandler Tick;
public IDisposable Subscribe(EventHandler handler)
{
Tick += handler;
return new Unsubscriber(this, handler);
}
private sealed class Unsubscriber : IDisposable
{
private Ticker _t;
private EventHandler _h;
private bool _done;
public Unsubscriber(Ticker t, EventHandler h) { _t = t; _h = h; }
public void Dispose()
{
if (!_done)
{
_t.Tick -= _h;
_done = true;
}
}
}
public void Fire()
{
EventHandler h = Tick;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Ticker t = new Ticker();
using (t.Subscribe((s, e) => Console.WriteLine("tick")))
{
t.Fire(); // prints once
}
t.Fire(); // nothing after disposal
}
}
Melepas dengan try/finally
Gunakan try/finally jika penangan harus dilepas meskipun pengecualian dilemparkan.
using System;
public class Alarm
{
public event EventHandler Ring;
public void Trigger()
{
EventHandler h = Ring;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Alarm a = new Alarm();
EventHandler h = (s, e) => Console.WriteLine("ring");
a.Ring += h;
try
{
a.Trigger(); // do work with subscription active
}
finally
{
a.Ring -= h; // always detach
}
a.Trigger(); // no output
}
}
Kiat untuk mencegah kebocoran
Kiat:
- Pelanggan harus bertanggung jawab atas proses berhenti berlangganan mereka (Dispose, finally, atau metode eksplisit).
- Hindari berlangganan menggunakan penangan anonim sebaris yang tidak dapat dihapus.
- Berhati-hatilah dengan peristiwa statis; peristiwa tersebut sering hidup lebih lama daripada objek.
- Jaga agar penangan tetap singkat; jangan memblokir penerbit.
Penyebab kebocoran pada peristiwa
Ringkasan
Ringkasan: Berhenti berlangganan untuk mencegah kebocoran, simpan referensi penangan agar dapat menghapusnya, dan utamakan pola pembersihan berbasis IDisposable atau finally untuk masa hidup peristiwa yang aman.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola event, jebakan (kebocoran memori)” gratis?
Ya — teks lengkap “Pola event, jebakan (kebocoran memori)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Pola event, jebakan (kebocoran memori)”?
Kenali dan perbaiki jebakan event: berhenti berlangganan untuk mencegah kebocoran memori, simpan referensi delegate untuk menghapusnya, dan gunakan pola langganan IDisposable. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.
Berapa lama pelajaran “Pola event, jebakan (kebocoran memori)” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- delegate, Action/Func, closure
- Event: publikasi/berlangganan, kata kunci event
- Pola event, jebakan (kebocoran memori)