Cara yang disukai untuk mendeklarasikan acara


14

Saya cukup senang dengan pemahaman saya tentang model acara .NET. Saya pikir saya mungkin salah paham sedikit nuansa sistem.

Ketika saya mulai memasukkan acara ke dalam kelas saya, saya akan menggunakan cara standar seperti:

public event EventHandler<MyEventArgs> MyEvent;

Ini berarti bahwa apa pun yang berlangganan acara tersebut memerlukan metode seperti:

void HandleThatEvent(object sender, MyEventArgs args){...}

Itu bagus, tetapi saya menemukan bahwa saya jarang peduli dengan pengirimnya, jadi itu membuat banyak tanda tangan metode membengkak.

Jadi saya beralih untuk menyatakan tipe delegasi saya sendiri

public delegate void MyEventHandler(SomeClass argument);

Yang mengurangi kekacauan, tetapi meninggalkan saya dengan masalah kecil ketika menulis handler:

eventImplmentor.MyEvent += HandleThatEvent;
.
.
.
void HandleThatEvent(/*oh, um, what arguments does it take? Intellisense isn't telling me*/)

Jadi saya harus kembali ke deklarasi delegasi dan mencari dan kemudian kembali dan menuliskannya, atau menyusunnya dan menunggu untuk diberi tahu.

Jadi sekarang, sebagai gantinya, saya hanya menggunakan Action, Action<T>atau template apa pun yang cocok.

public event Action<SomeClass> MyEvent;

Sehingga saya bisa mengarahkan kursor ke acara tersebut dan diberi tahu parameter apa yang diharapkannya.

Pertanyaan saya, setelah semua itu: Apakah ada praktik terbaik untuk mendeklarasikan peristiwa dalam C #? Haruskah saya kembali ke EventHandler<T>jalan, atau Action<T>dapat diterima?


Jangan lupa untuk memastikan pawang disalin secara lokal ke tempat Anda memecat acara, selalu ingin melakukan ini untuk keamanan utas.
Mengintai

Anda dapat menulis acara Anda sendiri yang cerdas, berarti & lean-type dalam kode enkapsulasi tetapi apa pun yang Anda publikasikan harus mengikuti pola standar atau itu hanya akan membingungkan pengguna kelas Anda (dan tampaknya beberapa alat juga).
Martin Maat

Jawaban:


8

Untuk penanganan acara internal yang sederhana, ada yang hanya menggunakan Actionatau Action<T>, seperti yang Anda usulkan. Saya cenderung menggunakan pola standar, termasuk Pengirim, bahkan untuk acara internal, karena Anda tidak pernah tahu kapan Anda nanti ingin mengekspos kelas atau acara, dan saya tidak ingin hukuman karena harus memperbaiki metode acara hanya untuk membuat itu publik.

Saya setuju dengan Anda bahwa tanda tangan penanganan acara sedikit lebih berat dari yang seharusnya untuk skenario sederhana, tetapi dirancang dengan baik untuk menangani migrasi inkremental karena argumen acara tambahan mungkin diperlukan dari waktu ke waktu. Secara keseluruhan, saya akan tetap dengan pola standar, terutama karena, seperti yang Anda catat, Anda hanya mendapatkan dukungan IntelliSense yang tepat jika Anda melakukannya.

Untuk apa nilainya, saya meluangkan waktu untuk hal ini dan muncul dengan pola penanganan acara yang berbeda: Event Signature di .NET - Menggunakan 'Pengirim' yang Diketik dengan Kuat? . Tujuannya di sini bukan untuk menghapus Pengirim, tetapi untuk membuatnya diketik kuat sebagai TSenderbukan diketik lemah System.Object. Ini bekerja dengan sangat baik; namun, ada yang kehilangan dukungan IntelliSense ketika Anda melakukan ini, jadi ada trade-off yang disayangkan.

Secara keseluruhan, saya akan tetap dengan pola standar, tetapi menarik untuk memikirkan cara-cara yang berpotensi lebih baik untuk melakukan ini.


Terima kasih telah mengarahkan saya ke pertanyaan SO Anda. Itu sangat menarik. Saya masih tidak mengerti mengapa pengirim begitu penting. Sebagian besar waktu saya tidak peduli dengan pengirimnya. Apakah ini hanya aturan MS yang sewenang-wenang?
Matt Ellen

Tidak, tentu saja Anda dapat mendeklarasikan delegasi sesuka Anda. Ini. Kebijakan NET untuk selalu menyertakan pengirim, dan itu tidak sepenuhnya merupakan ide yang buruk.
Neil

@ Neil: Saya mengerti bahwa itu kadang-kadang berguna, tapi saya tidak punya kebijakan untuk selalu melakukannya - terutama karena MS merekomendasikan melakukan acara dengan cara mereka. Salah satu hal yang saya sangat suka tentang acara adalah kemampuan untuk memisahkan kelas. Jika saya termasuk objek, maka itu digabungkan kembali. Jika itu hanya masalah kepatuhan CLS maka saya bisa hidup dengan itu.
Matt Ellen

Ini digabungkan kembali lagi hanya jika Anda menggunakan objek pengirim, jika tidak apa pun yang dimasukkan sebagai nilai pengirim karena Anda tidak menggunakannya. Ketergantungan hanya ada jika Anda perlu ada ketergantungan. Saya melihat dari mana Anda berasal, dan jika pengirim objek menghilang dari semua kode dari server mana pun di planet ini, saya tidak akan begadang.
Neil

Ya, Anda dapat mengirim 'null' sebagai pengirim jika Anda benar-benar ingin ... Tetapi, dengan menyertakan Pengirim, pengatur acara itu sendiri dapat berhenti berlangganan jika diinginkan. Namun secara keseluruhan, saya akan mengatakan bahwa mengetahui sumber acara biasanya cukup penting.
Mike Rosenblum
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.