Springen naar inhoud

C# - delegates & events


  • Log in om te kunnen reageren

#1

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 22 juli 2009 - 14:09

Weet iemand meer over dit onderwerp?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 22 juli 2009 - 16:29

Al eens op google gezocht? Dat levert je 250,000 resultaten op.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#3

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 22 juli 2009 - 18:38

Google is ook niet alles.

#4

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 22 juli 2009 - 18:56

Over delegates en events kun je een heel dik boek schrijven en dan nog heb je niet alles beschreven. Je zult veel specifieker moeten zijn met je vraag. Als je "iets" over events wilt weten dan is google je vriend, of anders een boek over C# in de bibliotheek of boekhandel. Heb je een specifieke vraag, dan kun je het wellicht hier proberen.
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#5

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 25 juli 2009 - 12:36

Nou dit is het algemene beeld:
Objectgeorienteerde talen zijn gestructureerd in klassen, wanneer programma's uitgevoerd worden worden er objecten aangemaakt die behoren tot die klassen, maar soms dienen boodschappen overgebracht te worden van het ene naar het andere object. Meestal wordt dit gedaan door middel van methode-oproepen, of in C# dus ook via veranderingen op eigenschappen (properties).

Soms echter dient een object een boodschap te sturen, maar weet het nog niet aan wie (welke objecten dus). Dat is ongeveer het doel van events. Stel je definieerd een knop (System.Windows.Forms.Button) op het moment dat je die knop aanklikt is het normaal dat er iets gebeurt, de programmeur die de knop definieerde weet echter niet welke methode hij dient aan te spreken (dat hangt immers af van wat je wil doen). Er is dus een event gedefineerd in button, die aangeroepen wordt op het moment dat je klikt. (Button.Click) Click is een standaard event, en is gelinkt met de EventHandler-delegate, een delegate zonder argumenten. Stel je hebt een methode X die je wilt aanroepen indien er geklikt wordt dan voeg je deze toe aan de click-event:
btnKnop.Click += new EventHandler(this.X);
Je maakt dus een eventhandler aan die gelinkt is aan de de methode X. Die eventhandler voeg je toe aan de event-lijst van Button.Click.

op het moment dat je klikt gaat de event alle delegates die opgeslagen zijn in de event af, en deze doen een invoke-operatie op de methodes. M.a.w. indien er geklikt wordt, zal methode X aangeroepen worden

De delegate bepaald de argumenten van de methodes die toegevoegd worden. En deze worden ook gecontroleerd door de compiler, het is dus een veilige manier van methode-invoke functies. In plaats van System.Runtime.InteropServices.

stel dat je zelf een event aanmaakt laat ons zeggen E, dan roep je deze als volgt op:
E(<lijst met parameters voor de methodeoproepen>);

Een event defineer je als een veld met volgende syntax
public event <gelinkte handler> <naam van de event>;
Bij System.Windows.Forms ziet de declaratie er dus als volgt uit:
public event EventHandler Click;

Een delegate is een soort klasse en zoals al gezegd wordt een delegate dus gebruikt om de parametertypes te definieren, een voorbeeld:
public delegate void EenDelegate(string naam);
void-wijst op het retourneertype, alleen methodes met als parameters ťťn string mogen dus toegevoegd worden.
stel we criŽren een event "Ev" hiervoor dan zal de code dus zijn:
public event EenDelegate Ev;
om hem op te roepen gebruiken we volgende syntax:
Ev("Hello World!");//bij wijze van voorbeeld uiteraard
Dat is ongeveer de inleiding, maar uiteraard zit er nog veel meer achter, het is meer om je op weg te helpen.
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#6

virtlink

    virtlink


  • >100 berichten
  • 158 berichten
  • Ervaren gebruiker

Geplaatst op 26 juli 2009 - 10:42

(Button.Click) Click is een standaard event, en is gelinkt met de EventHandler-delegate, een delegate zonder argumenten.

Dit is niet correct. In .Net worden events vrijwel altijd als volgt gedefinieerd:
public delegate void XYZEventHandler(object sender, XYZEventArgs e);
Oftewel, die hebben allemaal twee argumenten, en niet nul. De standaard EventHander heeft de volgende definitie:
public delegate void EventHandler(object sender, EventArgs e);
Maak je een methode die moet kunnen worden aangeroepen door die delegate, dan moet deze dan ook voldoen aan de signatuur van de delegate, bijvoorbeeld (de naam is arbitrair, maar het return-type en de parameters niet):
public void btnKnop_Click(object sender, EventArgs e)
{ /* Doe iets. */ }

Zoals Vladimir Lenin uitlegt is een delegate dus hoe .Net functiepointers implementeert. Delegates kan je ook zonder events gebruiken, bijvoorbeeld om C++ jumptable in C# te implementeren, als een array van delegates.

Als je zelf een event XYZ definieert, gebruik je een protected OnXYZ methode die je kan aanroepen om die event zich te laten voordoen. Bijvoorbeeld een event Ping, waarvoor we onze eigen event arguments PingEventArgs hebben gedefinieerd:
public delegate void PingEventHandler(object sender, PingEventArgs e);

public class Pinger
{
	public event Ping;
	
	protected virtual void OnPing(PingEventArgs e)
	{
		if (Ping != null)
			Ping(this, e);
	}

	public void PingMijEens(int getal)
	{
		OnPing(new PingEventArgs(getal));
	}
}
"Niet gehinderd door enige kennis van zaken..."

#7

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 26 juli 2009 - 19:43

Dit is niet correct. In .Net worden events vrijwel altijd als volgt gedefinieerd:

public delegate void XYZEventHandler(object sender, XYZEventArgs e);
Oftewel, die hebben allemaal twee argumenten, en niet nul. De standaard EventHander heeft de volgende definitie:
public delegate void EventHandler(object sender, EventArgs e);

mijn excuses dat was inderdaad een foutje van mij, enfin maar het was niet de bedoeling een opsomming van alle eventhandlers te geven, maar dus een algemeen beeld te geven wat events zijn en wat je ermee kunt doen, daar de TS zijn vraag niet verduidelijkte.

Veranderd door Vladimir Lenin, 26 juli 2009 - 19:51

"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#8

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 28 juli 2009 - 15:31

En waar zet ik die delegates en events neer? In het form?

#9

virtlink

    virtlink


  • >100 berichten
  • 158 berichten
  • Ervaren gebruiker

Geplaatst op 28 juli 2009 - 20:01

Als je je eigen events wilt maken en zelf zorgt dat ze zich voordoen, dan geldt:
  • Delegates (public delegate void EventHandler(...); ) moet je definiŽren in een namespace, maar buiten elke klasse.
  • Events (public event EventHandler MyEvent;[) moet je definiŽren in een klasse.
Als je bestaande events wilt gebruiken, dan geldt:
  • Event handler methodes (public void myForm_Button(...) {...}) definieer je in een klasse van je keus, een klasse waarin je het object gebruikt dat de events genereert.
  • Bindingen met de events (myForm.Button += new EventHandler(myForm_Button); ) stel je in in de constructor van de klasse waarin je de event handler methodes hebt gedefinieerd.
"Niet gehinderd door enige kennis van zaken..."

#10

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 29 juli 2009 - 19:19

Nou, het idee is dat ik een eenvoudige treinsimulatie maak, en de trein moet een event kunnen genereren om het vertrek van en aankomst op een station te melden. De opdracht is verder niet gedefinieerd, dus dat kan naar eigen invulling neem ik aan.

#11

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 30 juli 2009 - 11:32

Dat hangt af van de implementatie uiteraard, maar volgens mij kan je door je model (UML) een beetje aan te passen, ook dit soort zaken door middel van een eenvoudige methode oproep afhandelen. Als je een veld definieerd bij je trein die het huidige station bijhoud en je definieerd methodes op het station als RegistreerTrein (bij aankomst) en SchrapTrein (bij vertrek) hoef je helemaal geen events te gebruiken. Het is natuurlijk de keuze van het model. Al weet ik natuurlijk niet hoe de rest van het model ineen zit. Events zijn bijvoorbeeld handig wanneer je niet weet aan wat voor object je je verstrek of aankomst wil melden: (een belachelijk voorbeeld) stel dat je aan de stad moet melden dat je binnenkomt of buitengaat en er nog zo'n aantal objecten zijn, dan zou dat op den duur een hele organisatie vragen om met types te werken en methodes op te vragen, in dat geval heb je voordeel aan een event. Maar events zijn niet altijd de oplossing voor problemen.
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#12

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 30 juli 2009 - 14:40

Nou, de opdracht was juist dat er een event in moest, zoals ik omschreef, dus om dan een andere oplossing te bedenken is dan contraproductief he.

#13

Aries

    Aries


  • >25 berichten
  • 83 berichten
  • Ervaren gebruiker

Geplaatst op 11 augustus 2009 - 09:21

Een delegate is GEEN klasse !!!
het is een soort opgepimpte function pointer zoals je die in C++ ook gebruikt

#14

Nvt

    Nvt


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 11 augustus 2009 - 14:25

Een delegate is GEEN klasse !!!
het is een soort opgepimpte function pointer zoals je die in C++ ook gebruikt


Vreemd, ik zocht op: Delegate class,about Delegate class

en kreeg o.a. dit:
The Delegate class is the base class for delegate types. However, only the system and compilers can derive explicitly from the Delegate class or from the MulticastDelegate class. It is also not permissible to derive a new type from a delegate type. The Delegate class is not considered a delegate type; it is a class used to derive delegate types.

;)

#15

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 11 augustus 2009 - 20:50

C# probeert alles heel OO te doen, dat betekent dat een struct bijvoorbeeld wel een klasse is die een inheritance van System.ValueType is, idem voor interface, enum, en dus ook delegate
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures