Delegates

Tags:    .net
Skrevet af Bruger #285 @ 23.01.2007
Af hvad for en fisk? Den er god nok, "delegates". Ligesom så mange andre ting, der virker mærkelige ved første øjekast, viser det sig smart - uundværdligt - når først lige man kommer under huden på dem. Delegates er i ordets betydning "uddelere" så at sige. Mere teknisk er det funktionsvariable. På samme måde som man kan assigne tal i en variabel af typen int, kan man assigne funktioner til en variabel af en delegate-type. Og for at drage yderligere analoger, så på samme måde, som det udelukkende er heltal, der kan tildeles til en variabel af typen int, så er der tilsvarende nogle krav til hvilke der kan lægges i en variabel af en delegate-type. Vi må hellere lige få lidt kode:
Fold kodeboks ind/udKode 


Okay, lad os lige notere et par iagttagelser ud fra overstående:
* En delegate skal beskrive returtype samt parametrene til en funktion
* Evt. parametre i en delegate skal angives med navne, selvom disse aldrig vil blive brugt (ja det er mærkeligt!)
* Man angiver godt nok en funktion som helhed (her Console.WriteLine), men det er faktisk kun et bestemt overload af denne, man angiver (kan spottes ud fra de beskrevne parametre i delegaten); eksempelvis kan man ikke skrive:
Fold kodeboks ind/udKode 

Det passer nemlig ikke med den angivne delegate, selvom funktionen Console.WriteLine godt nok har en overload, der tillader det
* Når man assigner en variabel af en delegate-type, skal man ikke medtage paranteserne på funktionen

Okay, det virker jo smart nok - og ja, det er det også. Det var så lidt teoretisk om delegates - hvad de reelt kan anvendes til, er måske lidt mere difust hvis ikke man har arbejdet med anonyme metoder eller events. Man kan sige (for at lette forståelsen), at delegates er funktionsskabaloner; de beskriver hvordan en funktion, skal "se ud". Og det, der kendetegner en funktion (udadtil) er netop parameterlisten samt returtypen.

Jeg vil ikke fortælle nærmere om events eller anonyme funktioner nu, men jeg vil prøve at vise lidt med delegates, og hvad de reelt kan bruges til. Lad os sige vi har en liste med en række tekststrenge, som vi ønsker at sortere efter nogle krav - dvs. finde nogle tekststrenge efter nogle krav. Det kan vi gøres på følgende måde:
Fold kodeboks ind/udKode 


Funktionen FindAll tager en Predicate<T> delegate som argument - se dokumentation om denne:
http://msdn2.microsoft.com/en-us/library/bfcke1bz.aspx

Og lige et lille hurtigt eksempel her til sidst, hvor det lige hurtigt vises, hvad en anonym metode er, og hvordan den kan bruges. Normalt når man sorterer en liste, sker det stigende - hvis man gerne vil have det gjort faldende, kan det eksempelvis gøres således (ved en liste af Int32):
Fold kodeboks ind/udKode 


Se, delegates er jo ikke helt så dumt endda ;-)


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (2)

User
Bruger #285 @ 25.01.07 10:01
Hej. Jeg kan se mine nye artikler bliver stemt til 1 og 2. Det er selvfølgelig helt okay, men I må hjertens gerne lige knytte en kommentar til hvorfor, således jeg har mulighed for at ændre det i fremtiden. Hvis I vil være anonyme, kan I bare sende det til KasperTSW og sige det, så kan han vidregive det til mig uden jeres navn. Men altså: jeg har intet imod lave bedømmelser, jeg vil bare gerne have en mulighed for at kunne gøre det bedre fremover.
User
Bruger #8985 @ 12.04.07 15:34
Jeg kunne godt tænke mig et eksempel på brug af både events og delegates. Det er det jeg interesserer mig mest for lige i øjeblikket, men jeg synes ikke jeg kan finde noget ordentligt materiale om det. Jeg vil ikke give en rate, da jeg ikke ved nok om emnet, men nu får du en kommentar, som du efterlyste :)
Du skal være logget ind for at skrive en kommentar.
t