Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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,

Hasonló előadás


Az előadások a következő témára: "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,"— Előadás másolata:

1 Krizsán Zoltán iit 1.1

2  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

3 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

4 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

5  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

6  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

7  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

8  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

9  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

10  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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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

19  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

20 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

21  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


Letölteni ppt "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,"

Hasonló előadás


Google Hirdetések