Csharp/Delegates

Fra Wikibøker – frie læremidler
(Omdirigert fra «Csharp/Kapittel14»)

Delegates[rediger]

Delegates er referanser til funksjoner, og også en reference type, og blir hyppig brukt til såkalte events i .NET som vi skal kikke på etterhvert. Disse kan også brukes til å kommunisere med funksjoner i native biblioteker, men måten dette gjøres på, vil jeg ikke gå nærmere inn på. delegates deklareres nesten som en funksjon.

public delegate int MyFunction();

MyFunction vil nå bli en datatype, som kan brukes i events, eller i andre tilfeller. for å deklarere en variabel av typen MyFunction, gjør man det samme som vanlige variabler, men for å initsialisere, må man tenke seg at dette er en klasse.

MyFunction func = new MyFunction(this.AFunction);

der AFunction er en hvilken som helst funksjon som passer definisjonen til MyFunction. Deretter kaller man vairablen som om det var en funksjon

int myint = func();

Anonymous functions[rediger]

I enkelte tilfeller er man også interresert i noe som kalles anonyme funksjoner, som regel blir dette gjort fordi det blir mindre kode. Denne funksjonen er kun tilgjengelig i .NET 2.0 og utover. Se på en funksjon som heter System.Drawing.Image.GetThumbnailImage. Denne tar nå en funksjon, som er en delegate, som alltid skal returnere false. Man kunne laget en egen funksjon som returnerer false, men det enkleste er å bruke anonyme funksjoner.

System.Drawing.Bitmap bmp = System.Drawing.Bitmap.FromImage("C:\\image.bmp");
System.Drawing.Bitmap thumb = bmp.GetThumbnailImage(64, 64, new System.Drawing.Image.GetThumbnailImageAbort() { return false; }, IntPtr.Zero);

Events[rediger]

Events er funksjoner som blir kalt når en spesiell ting utføres, som hvis brukeren trykker på museknappen, vil Click event bli avfyrt på kontrollen som trykkes på. Events er i utgangspunktet kun en array med delegates, og en delegate kreves for å deklarere en event. Man må også alltid huske å sjekke om en event er tilegnet en eller flere verdier, ved å sjekke om den er null

public delegate int mydelegate();
public event mydelegate MyEvent;
//...
if(MyEvent != null)
  MyEvent();