események c#-ban

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

Upload: shima

Post on 23-Feb-2016

52 views

Category:

Documents


0 download

DESCRIPTION

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: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Események C#-ban

Események C#-banKrizsán Zoltán

iit1.1

Page 2: Események C#-ban

Események C#-ban 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)

Krizsán Zoltániit

Page 3: Események C#-ban

Események C#-ban 3

Lehetőségek1. Egy objektum bejelentheti érdeklődését

egy esemény iránt2. Egy objektum visszavonhatja érdeklődését

egy esemény iránt3. Egy objektum eseményt definiálhat, amit

közzétehet.

Krizsán Zoltániit

Page 4: Események C#-ban

Események C#-ban 4

Példa

Krizsán Zoltániit

Fax Nyomtató

Levelező menedzser

Új üzenet érkezikBejelentik

é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

Page 5: Események C#-ban

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 {}

Krizsán Zoltániit

Page 6: Események C#-ban

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

Krizsán Zoltániit

Page 7: Események C#-ban

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!

Krizsán Zoltániit

Page 8: Események C#-ban

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.

Krizsán Zoltániit

Page 9: Események C#-ban

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("BeforeSt

art")] public class Sender : System.ComponentModel.Component {}

Krizsán Zoltániit

Page 10: Események C#-ban

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); }

Krizsán Zoltániit

Page 11: Események C#-ban

Események C#-ban 11

Az eseményt megosztó osztály tervezése VÉszlelő fv. definiálása

1. Észleli a várt eseményt2. Létrehozza az esemény paraméter osztály

példányát3. Meghívja az értesítő fv.-t. átadva annak az

objektumot.

Krizsán Zoltániit

Page 12: Események C#-ban

Események C#-ban 12

Példa kódja

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ániit

Page 13: Események C#-ban

Események C#-ban 13

Mi is történik?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ániit

Page 14: Események C#-ban

Események C#-ban 14

Mi is történik? IIprivate 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ániit

Page 15: Események C#-ban

Események C#-ban 15

Az érdeklődő osztály tervezése1. 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ániit

Page 16: Események C#-ban

Események C#-ban 16

Az érdeklődő osztály tervezése II

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ániit

Page 17: Események C#-ban

Események C#-ban 17

Példa kódja – Fax osztályclass 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ániit

Page 18: Események C#-ban

Események C#-ban 18

Példa kódja – Pager osztályclass 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ániit

Page 19: Események C#-ban

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!

Krizsán Zoltániit

Page 20: Események C#-ban

Események C#-ban 20

Példakód változásaclass 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ániit

Page 21: Események C#-ban

Események C#-ban 21

Névtelen (Anonymous) fv. delegátumhoz rendelhetünk egy kódblokkotobj.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ániit