1 / 21

Események C#-ban

Események C#-ban. Krizsán Zoltán iit 1.1. Mi az?. Aszinkron történésről értesítés egy vagy több objektum számára. Delegátumok segítségével valósítja meg a C #. event típus, melynek hatására generálódnak:

shima
Download Presentation

Események C#-ban

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Események C#-ban Krizsán Zoltán iit 1.1

  2. Mi az? • Aszinkron történésről értesítés egy vagy több objektum számára. • Delegátumok segítségével valósítja meg a C#. • event típus, melynek hatására generálódnak: • feliratkozó, leíratkozófv. (add_XX, remove_XX), amit mi +=, -= formában hívhatunk • delegátum adattag (privát) Események C#-ban

  3. Lehetőségek • Egy objektum bejelentheti érdeklődését egy esemény iránt • Egy objektum visszavonhatja érdeklődését egy esemény iránt • Egy objektum eseményt definiálhat, amit közzétehet. Események C#-ban

  4. Fax Nyomtató Értesítés az esemény bekövetkezéséről Levelező menedzser Bejelentik érdeklődésüket az esemény iránt Új üzenet érkezik Példa Definiál egy eseményt Események C#-ban

  5. Az eseményt megosztó osztály tervezése IEsemény paramétereinek definiálása • Ha szükségünk van paraméterre.(Sender-t mindenképp megkapja) • Osztály definiálása (neve vége EventArg), őse a Systen.EventArgs • public class StartEventArgs : System.EventArgs {} Események C#-ban

  6. Az eseményt megosztó osztály tervezése IIDelegátum definiálása • Ha van saját esemény paraméter, akkor kell saját delegátum típus is! • Ha nincs, akkor használjuk a System.EventHandler Események C#-ban

  7. Az eseményt megosztó osztály tervezése IIDelegátum definiálása • Ajánlások: • Neve: EventHandler végű • void visszatérés • 2 paraméter: • Első: küldő objektum • Második: paraméterek osztály példánya • Ha nincs + paraméter, akkor használjuk a System.EventHandler-t, aminek a 2. paramétere EventArgs.Empty legyen! Események C#-ban

  8. Az eseményt megosztó osztály tervezése IIIEsemény definiálása • Az előzőleg definiált delegátum a típusa! • Ismernie kell mind a kiterjesztő, mind az érdeklődő osztályoknak! • Láthatósága általában publikus! • Gyakran tulajdonságnak definiáljuk! • Minden esetben a küldő osztály hozza létre. Események C#-ban

  9. Az eseményt megosztó osztály tervezése III (opcionális)Alapértelmezett esemény definiálása • Ha a megosztó osztály komponens • Egy esemény megjelölhető • [System.ComponentModel.DefaultEvent("BeforeStart")] public class Sender : System.ComponentModel.Component{} Események C#-ban

  10. Az eseményt megosztó osztály tervezése IVÉrtesítő fv. definiálása • Protected, virtual a javasolt • Paramétere az esemény paraméter osztály példánya • Neve On-al kezdődik és a vége az esemény neve! • Ellenőrzi, hogy érdeklődik –e valaki az esemény iránt, majd meghívja azokat!protected virtual void OnBeforeStart(StartEventArgs e) { if (BeforeStart != null) BeforeStart(this, e); } Események C#-ban

  11. Az eseményt megosztó osztály tervezése VÉszlelő fv. definiálása • Észleli a várt eseményt • Létrehozza az esemény paraméter osztály példányát • Meghívja az értesítő fv.-t. átadva annak az objektumot. Események C#-ban

  12. Példa kódja classMailManager{ publicclassMailMsgEventArgs : EventArgs { publicMailMsgEventArgs( Stringfrom, Stringto, Stringsubject, String body){ this.from =from;this.to = to; this.subject =subject;this.body =body; } publicreadonlyStringfrom, to, subject, body; } publicdelegatevoidMailMsgEventHandler(Objectsender, MailMsgEventArgsargs); publiceventMailMsgEventHandlerMailMsg; protectedvirtualvoidOnMailMsg(MailMsgEventArgs e){ if (MailMsg !=null){ MailMsg(this, e); }} publicvoidSimulateArrivingMsg(Stringfrom, Stringto, Stringsubject, String body){ MailMsgEventArgs e = newMailMsgEventArgs(from, to, subject, body); OnMailMsg(e); } } 1 2 3 4 5 Események C#-ban

  13. Mi is történik? publiceventMailMsgEventHandlerMailMsg; Sor hatására: • Privatedelegátum adattag (linkelt lista feje) • Publikus add_ tagfv. (System.Delegate.Combinefv.-t hívja) • Publikus remove_ tagfv. (System.Delegate.Removefv.-t hívja) jön létre. Események C#-ban

  14. Mi is történik? II private MailMsgEventHandler MailMsg = null; [MethodImplAttribute(MethodImplOptions.Synchronized)] public void add_MailMsg(MailMsgEventHandler handler) { MailMsg = (MailMsgEventHandler) Delegate.Combine(MailMsg, handler); } [MethodImplAttribute(MethodImplOptions.Synchronized)] public void remove_MailMsg(MailMsgEventHandler handler) { MailMsg = (MailMsgEventHandler) Delegate.Remove(MailMsg, handler); } Események C#-ban

  15. Az érdeklődő osztály tervezése • Definiáljunk legalább 3 tagfv.-t: • Konstruktort • Eseménykezelő • Érdeklődést visszavonó (unregister) • Konstruktor: • kapja meg a érdekelt eseményt küldő osztályt! • a fv. végén jelentse be érdeklődését az esemény iránt! operator+= Eseménykezelő, ami átfordul xxx.add_ fv. Hívásra. Események C#-ban

  16. Az érdeklődő osztály tervezése II • Eseménykezelő fv.Paraméterszignatúrája meg kell egyezzen az esemény delegátum típusával! • Érdeklődést visszavonó (unregister)operator-= Eseménykezelő, ami átfordul xxx.remove_ fv. Hívásra.Esetleg meghívhatja a Dispose-t is. Események C#-ban

  17. Példa kódja – Fax osztály class Fax{ public Fax(MailManager mm){ mm.MailMsg += new MailManager.MailMsgEventHandler(FaxMsg); } private void FaxMsg(Object Sender, MailManager.MailMsgEventArgs e){ Console.WriteLine("Faxing mail message:"); Console.WriteLine(" To: {0}\n From: {1}\n Subject: {2}\n Body: {3}\n", e.from, e.to, e.subject, e.body); } public void Unregister(MailManager mm){ MailManager.MailMsgEventHandler callback = new MailManager.MailMsgEventHandler(FaxMsg); mm.MailMsg -= callback; } } Események C#-ban

  18. Példa kódja – Pager osztály class Pager{ public Pager(MailManager mm) { mm.MailMsg += new MailManager.MailMsgEventHandler(PagerMsg); } private void PagerMsg(Object Sender, MailManager.MailMsgEventArgs e){ Console.WriteLine("Pager message:"); Console.WriteLine(" To: {0}\n From: {1}\n Subject: {2}\n Body: {3}\n", e.from, e.to, e.subject, e.body); } public void Unregister(MailManager mm) { MailManager.MailMsgEventHandler callback = new MailManager.MailMsgEventHandler(PagerMsg); mm.MailMsg -= callback; } } Események C#-ban

  19. Esemény regisztráció feletti közvetlen felügyelet • A generált kód nem ideális! • Ha nincs párhuzamosság, akkor felesleges a[MethodImplAttribute(MethodImplOptions.Synchronized)]attribútum, ami lassít! • Pláne ha még loggolni is kell! Események C#-ban

  20. Példakód változása class MailManager { public class MailMsgEventArgs : EventArgs{…} public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); private MailMsgEventHandler mailMsgEventHandlerDelegate; public event MailMsgEventHandler MailMsg{ add { mailMsgEventHandlerDelegate = (MailMsgEventHandler) Delegate.Combine(mailMsgEventHandlerDelegate,value); } remove{ mailMsgEventHandlerDelegate = (MailMsgEventHandler) Delegate.Remove(mailMsgEventHandlerDelegate,value); } } protected virtual void OnMailMsg(MailMsgEventArgs e) { if (mailMsgEventHandlerDelegate !=null){ mailMsgEventHandlerDelegate(this, e); } } public void SimulateArrivingMsg(String from,String to,String subject,String body){…} } Események C#-ban

  21. Névtelen (Anonymous) fv. • delegátumhoz rendelhetünk egy kódblokkot obj.Esemeny+= delegate{ Console.WriteLine(”Esemény létrejött!"); }; • Elérheti a lokális változókat • NEM érheti el a fv. out,ref paramétereit! Események C#-ban

More Related