Krizsán Zoltán iit 1.1
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) Krizsán Zoltán iit Események C#-ban2
1. Egy objektum bejelentheti érdeklődését egy esemény iránt 2. Egy objektum visszavonhatja érdeklődését egy esemény iránt 3. Egy objektum eseményt definiálhat, amit közzétehet. Krizsán Zoltán iit Események C#-ban3
Krizsán Zoltán iit Események C#-ban4 FaxNyomtató Levelező menedzser Új üzenet érkezik Bejelentik érdeklődésüket az esemény iránt Értesítés az esemény bekövetkez éséről Definiál egy eseményt
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 { } Krizsán Zoltán iit Események C#-ban5
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 Krizsán Zoltán iit Események C#-ban6
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! Krizsán Zoltán iit Események C#-ban7
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. Krizsán Zoltán iit Események C#-ban8
Ha a megosztó osztály komponens Egy esemény megjelölhető [System.ComponentModel.DefaultEvent("BeforeSt art")] public class Sender : System.ComponentModel.Component { } Krizsán Zoltán iit Események C#-ban9
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); } Krizsán Zoltán iit Események C#-ban10
1. Észleli a várt eseményt 2. Létrehozza az esemény paraméter osztály példányát 3. Meghívja az értesítő fv.-t. átadva annak az objektumot. Krizsán Zoltán iit Események C#-ban11
class MailManager{ public class MailMsgEventArgs : EventArgs { public MailMsgEventArgs( String from, String to, String subject, String body){ this.from =from;this.to = to; this.subject =subject;this.body =body; } public readonly String from, to, subject, body; } public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); public event MailMsgEventHandler MailMsg; protected virtual void OnMailMsg(MailMsgEventArgs e){ if (MailMsg !=null){ MailMsg(this, e); }} public void SimulateArrivingMsg(String from, String to, String subject, String body){ MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body); OnMailMsg(e); } Krizsán Zoltán iit Események C#-ban12
public event MailMsgEventHandler MailMsg; Sor hatására: 1. Private delegátum adattag (linkelt lista feje) 2. Publikus add_ tagfv. (System.Delegate.Combine fv.-t hívja) 3. Publikus remove_ tagfv. (System.Delegate.Remove fv.-t hívja) jön létre. Krizsán Zoltán iit Események C#-ban13
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); } Krizsán Zoltán iit Események C#-ban14
1. Definiáljunk legalább 3 tagfv.-t: Konstruktort Eseménykezelő Érdeklődést visszavonó (unregister) 2. 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. Krizsán Zoltán iit Események C#-ban15
3. Eseménykezelő fv. Paraméterszignatúrája meg kell egyezzen az esemény delegátum típusával! 4. Érdeklődést visszavonó (unregister) operator-= Eseménykezelő, ami átfordul xxx.remove_ fv. Hívásra. Esetleg meghívhatja a Dispose-t is. Krizsán Zoltán iit Események C#-ban16
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; } Krizsán Zoltán iit Események C#-ban17
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; } Krizsán Zoltán iit Események C#-ban18
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! Krizsán Zoltán iit Események C#-ban19
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){…} } Krizsán Zoltán iit Események C#-ban20
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! Krizsán Zoltán iit Események C#-ban21