[.net] waarom delegate?

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

  • semicon
  • Registratie: Augustus 2003
  • Laatst online: 20-08-2025
Waarom zou ik delegates gebruiken in .net, ik zie het nut er niet van in.
Ik heb verschillende "tutorials" gelezen, en ik probeer het te begrijpen maar ik zie niet in waarom ik het zou gebruiken.

Hier staat zo'n voorbeeld als ik bedoel zoals je op vele sites tegen komt: http://www.dnzone.com/forum/topic.asp?topic_id=211

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Class1
 Delegate Sub dele()
 Shared Sub main()
  'Declare variables of delegate type
  Dim d_h As dele
  'make d_h point the sub Hello
  d_h = AddressOf Hello
  'make a point to Hello
  d_h()
 End Sub

 Shared Sub Hello()
  Console.WriteLine("Hello")
 End Sub

End Class


Waarom zou ik niet meteen een Hello() aanroepen ? 8)7

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Delegates worden gebruikt om methods als 'first-class' objecten te kunnen gebruiken. Dat wil zeggen dat je dan methods kunt doorgeven als argument of methods als returnvalue kunt teruggeven in een andere method.

In vele talen, zoals Python, zijn methods sowieso al first-class, maar dit is dus niet het geval in .net. Specifiek worden delegates in .NET ook gebruikt bij het afhandelen van events

Misschien moet je de MSDN eens bekijken. Dat is toch wel de beste site ivm met informatie/tutorials over Microsoft technologieën.

[ Voor 21% gewijzigd door Feyd-Rautha op 07-07-2006 14:55 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

delegates kun je heel simpel in een andere thread laten lopen.

stel dat Hello() een functie was die 10 seconden bezig is, en jij voert die in jouw hoofd-thread uit, is jouw GUI 10 seconden niet responsief, wat veel gebruikers als irritant/een vastloper ervaren.

oftewel, delegates zijn (onderdeel van) de basis van multithreading!

-niks-


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Delegates worden inderdaad ook gebruikt om asynchrone method-calls uit te voeren om het bovenstaande probleem (MLM) op te lossen.

Maar delegates zijn niet echt de basis voor multi-threading. Java heeft geen delegates, smalltalk heeft ook geen delegates, geen enkele taal, behalve de .net talen, hebben delegates en die kunnen toch ook met multithreading overweg.

[ Voor 15% gewijzigd door Feyd-Rautha op 07-07-2006 15:15 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 22-12-2025

PhysicsRules

Dux: Linux voor Eenden

In C# worden delegate gebruikt voor event-handling.

Delegates zijn .Nets methode om run-time te bepalen welke methodes gebruikt moeten worden en dan vooral in situaties waarin die methode niet meteen gebruikt moet worden.

Zodra een event plaatsvindt, kijkt het programma welke methodes er allemaal aangemeld zijn en voert die uit.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Delegates woorden ook gebruikt icm events.
Denk aan een Form met een Button:
C#:
1
deurknop.OnClick += FunctieDelegate;

Op het moment dat je op de knop klikt, wordt FunctieDelegate() uitgevoerd.

:w PhysicsRules

[ Voor 7% gewijzigd door kenneth op 07-07-2006 15:15 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Een delegate is gewoon een verwijzing naar een methode (inclusief het object waar de methode op aangeroepen moet worden). In jouw voorbeeld is de delegate idd knap nutteloos, maar je moet bedenken dat je de delegate ook naar een andere methode met dezelfde signature kunt laten wijzen. Andere code kan vervolgens die delegate aanroepen zonder dat het hoeft te weten waar het precies naar wijst.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Er zien ook een hoop GoT postings te vinden over delegates. Deze thread hieronder geeft aardig wat achtergrondinformatie:
[rml][ vb.net] delegates[/rml]

It’s nice to be important but it’s more important to be nice


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-02 21:33
Feyd-Rautha schreef op vrijdag 07 juli 2006 @ 15:12:
Maar delegates zijn niet echt de basis voor multi-threading. Java heeft geen delegates
Accoord.
smalltalk heeft ook geen delegates, geen enkele taal, behalve de .net talen, hebben delegates en die kunnen toch ook met multithreading overweg.
Smalltalk heeft closures ('blocks' in Smalltalk-taal), die algemener zijn dan delegates. Die worden ook vaak op dezelfde manier gebruikt als delegates in .Net (namelijk voor callbacks, al dan niet asynchroon).

Verder zijn er natuurlijk stapels talen die een of andere vorm van closures ondersteunen. Verder kun je ze ook prima implementeren zonder dat de CLR ze ondersteunt, dus daaruit blijkt ook wel dat ze niet essentieel zijn voor multi-threading (of voor wat dan ook).

[ Voor 4% gewijzigd door Soultaker op 07-07-2006 17:08 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15-02 21:11
PhysicsRules schreef op vrijdag 07 juli 2006 @ 15:13:
In C# worden delegate gebruikt voor event-handling.
Klopt het dus om te stellen dat als je een modulaire applicatie maakt waarbij iedereen plug-ins kan schrijven je dus alle events d.m.v. delegates af moet handelen, opdat de andere assemblies methoden aan deze 'events' kunnen hangen :?.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-02 21:33
Niets moet - het is gewoon een optie die je hebt. De techniek die in Java gebruikelijk is met Listeners werkt min of meer hetzelfde. Het voordeel van delegates en events is dat de programmeertalen er al ondersteuning voor bieden en je jezelf dus veel werk kunt besparen door er gebruik van te maken. Vandaar dat het een goed idee is om die structuur ook in je eigen programma's te gebruiken.

Verder is het voordeel van het gebruik van events dat er een hele losse koppeling is tussen gebeurtenissen (events) en de acties die daarop volgen. Het is daarom ideaal voor systemen die uit verschillende onafhankelijke componenten (plug-ins zijn dat inderdaad meestal) bestaan; componenten hoeven elkaar dan niet direct aan te roepen, of zelfs maar van elkaars bestaan of te weten, om samen te kunnen werken. Dat maakt het een stuk makkelijker om afzonderlijke componenten te schrijven zonder dat daarvoor andere componenten gewijzigd hoeven worden.

Verwijderd

Feyd-Rautha schreef op vrijdag 07 juli 2006 @ 15:12:
Java heeft geen delegates, smalltalk heeft ook geen delegates, geen enkele taal, behalve de .net talen, hebben delegates
Ehm... Delphi kent al vanaf het begin (dik 10 jaar terug) delegates, alleen heten ze dan 'procedure of object'.
Hjelberg (grote architect achter zowel Delphi als .NET) heeft dat principe gewoon meegenomen naar .NET, en 't een tikkie verbeterd. Zo kun je in .NET bv. meerdere event handlers (delegates) aan 1 event hangen, terwijl in Delphi de handler zelf ervoor moet zorgen dat de al geregistreerde handler ook wordt aangeroepen.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 22-12-2025

PhysicsRules

Dux: Linux voor Eenden

Dennis schreef op zaterdag 08 juli 2006 @ 16:56:
[...]

Klopt het dus om te stellen dat als je een modulaire applicatie maakt waarbij iedereen plug-ins kan schrijven je dus alle events d.m.v. delegates af moet handelen, opdat de andere assemblies methoden aan deze 'events' kunnen hangen :?.
In C# worden events altijd al door een delegate afgehandeld. Events en delegates zijn onlosmakelijk met elkaar verbonden.

Voor add-ins zijn delegates in combinatie met interfaces natuurlijk ideaal.
Pagina: 1