Ambil kelas C # berikut:
c1 {
event EventHandler someEvent;
}
Jika ada banyak langganan untuk c1
's someEvent
acara dan saya ingin menghapus mereka semua, apa cara terbaik untuk mencapai ini? Juga pertimbangkan bahwa berlangganan ke acara ini bisa / adalah delegasi lambdas / anonim.
Saat ini solusi saya adalah menambahkan ResetSubscriptions()
metode ke c1
set someEvent
ke nol. Saya tidak tahu apakah ini memiliki konsekuensi yang tidak terlihat.
EventHandlerList
, Anda mungkin bisa. Anda harus mengenali kedua kasus itu - dan mungkin ada sejumlah implementasi lainnya.hidden
.Tambahkan metode ke c1 yang akan mengatur 'someEvent' ke nol.
sumber
Lebih baik menggunakan
delegate { }
daripadanull
menghindari pengecualian ref kosong.sumber
List.Clear()
vsmyList = null
.Mengatur acara ke nol di dalam karya kelas. Saat Anda membuang kelas, Anda harus selalu mengatur acara ke nol, GC memiliki masalah dengan acara dan mungkin tidak membersihkan kelas yang dibuang jika memiliki acara yang menggantung.
sumber
Praktik terbaik untuk menghapus semua pelanggan adalah mengatur someEvent ke nol dengan menambahkan metode publik lain jika Anda ingin mengekspos fungsi ini ke luar. Ini tidak memiliki konsekuensi yang tak terlihat. Syaratnya adalah untuk mengingat untuk mendeklarasikan SomeEvent dengan kata kunci 'event'.
Silakan lihat buku - C # 4.0 singkatnya, halaman 125.
Seseorang di sini mengusulkan untuk menggunakan
Delegate.RemoveAll
metode. Jika Anda menggunakannya, kode sampel dapat mengikuti formulir di bawah ini. Tapi itu benar-benar bodoh. Kenapa tidakSomeEvent=null
di dalamClearSubscribers()
fungsinya saja?sumber
Anda dapat mencapai ini dengan menggunakan metode Delegate.Remove atau Delegate.RemoveAll.
sumber
Komentar membosankan yang diperpanjang secara konseptual.
Saya lebih suka menggunakan kata "event handler" daripada "event" atau "delegate". Dan menggunakan kata "event" untuk hal-hal lain. Dalam beberapa bahasa pemrograman (VB.NET, Object Pascal, Objective-C), "event" disebut "pesan" atau "sinyal", dan bahkan memiliki kata kunci "pesan", dan sintaksis gula spesifik.
Dan, untuk menanggapi "pesan" itu, seorang "pengendali acara" merespons, apakah delegasi tunggal atau banyak delegasi.
Rangkuman: "Acara" adalah "pertanyaan", "pengendali acara" adalah jawabannya.
sumber
Ini solusi saya:
Anda perlu menelepon
Dispose()
atau menggunakanusing(new Foo()){/*...*/}
pola untuk berhenti berlangganan semua anggota daftar doa.sumber
Hapus semua acara, anggap acara adalah tipe "Aksi":
sumber
GetInvocationList
.Alih-alih menambahkan dan menghapus callback secara manual dan memiliki banyak jenis delegasi yang dideklarasikan di mana-mana:
Anda dapat mencoba pendekatan umum ini:
sumber