Programmering

Hvordan jobbe med delegater i C #

En delegat er en typesikker funksjonspeker som kan referere til en metode som har samme signatur som delegatens. Du kan dra nytte av delegater i C # for å implementere hendelser og tilbakekallingsmetoder. En multicast-delegat er en som kan peke på en eller flere metoder som har identiske signaturer.

Forstå delegater i C #

I hovedsak har en delegat en referanse til en metode og også til målobjektet som metoden skal kalles på. Delegater i C # ligner funksjonspekere i C ++, men C # delegater er typesikre. Du kan sende metoder som parametere til en delegat slik at delegaten kan peke på metoden. Delegater brukes til å definere tilbakeringingsmetoder og implementere håndtering av hendelser, og de blir erklært ved hjelp av "delegat" nøkkelordet. Du kan erklære en delegat som kan vises alene eller til og med nestet i en klasse.

Det er tre trinn i bruk av delegater. Disse inkluderer erklæring, instantiering og påkallelse.

Signaturen til en delegat ser slik ut:

delegere resultat-type-id ([parametere])

Følgende uttalelse viser hvordan du kan erklære en delegat.

offentlig delegat ugyldig MyDelegate (strengtekst);

Som du kan se i utsagnet ovenfor, er delegatnavnet "MyDelegate", det har en returtype "void", og det aksepterer et strengobjekt som et argument. Dette innebærer at delegaten MyDelegate kan peke på en metode som har identisk signatur. Dette er bare en erklæring - du må starte en delegat før du kan bruke den. Uttalelsen gitt neste viser hvordan du kan instantiere delegaten deklarert ovenfor.

MyDelegate d = ny MyDelegate (ShowText);

Når du har erklært og instansert delegaten, kan du enkelt påkalle metoden som delegaten peker på.

d ("Hello World ...");

Her er d delegatinstansen

Du kan også påkalle metoden som delegatforekomsten viser til ved å bruke metoden Invoke () på delegatforekomsten som vist nedenfor.

d.Invoke ("Hello World ...");

Hvis du har en metode som godtar to tall, og du vil legge til dem og returnere summen av de to tallene, kan du bruke en delegat til å lagre returverdien til metoden som vist i kodebiten gitt nedenfor.

int resultat = d (12, 15);

Her er den komplette kodelisten for din referanse.

bruker System;

navneområdet delegater

{

offentlig delegat int MyDelegate (int x, int y);

klasse Program

    {

statisk int Sum (int x, int y)

        {

returnere x + y;

        }

statisk tomrom Main ()

        {

MyDelegate d = ny MyDelegate (Sum);

int resultat = d.Invoke (12, 15);

Console.WriteLine (resultat);

Console.ReadLine ();

        }

    }

Delegater i aksjon i C #

Her er den komplette kodelisten.

bruker System;

navneområdet delegater

{

offentlig delegat ugyldig MyDelegate (strengtekst);

klasse Program

    {

offentlig statisk tomrom ShowText (strengtekst)

        {

Console.WriteLine (tekst);

        }

statisk tomrom Main ()

        {

MyDelegate d = ny MyDelegate (ShowText);

d ("Hello World ...");

Console.ReadLine ();

        }

    }

}

Merk at du kan tilordne flere objekter til en delegatforekomst ved hjelp av + -operatøren, noe som gjør delegaten til en multicasting-delegat. Du kan også kombinere delegerte forekomster ved hjelp av den statiske metoden Kombinere.

Kjøretiden vedlikeholder en liste (også kalt Invocation-liste) internt for å utføre flere metoder. Følgende kodeliste viser hvordan du kan bruke Combine () -metoden til å kombinere flere delegatforekomster.

myDelegate d1 = ny myDelegate (Method1);

myDelegate d2 = ny myDelegate (Method2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

En delegat som kan peke på flere metoder er kjent som en multicast-delegat. Merk at delegerte forekomster er uforanderlige. Så når du kombinerer delegater eller trekker en delegatforekomst fra listen, opprettes en ny delegatforekomst for å representere den oppdaterte eller nye listen over målene eller metodene som skal påkalles.

Multicast-delegater i aksjon i C #

Følgende kodeliste illustrerer en multicast-delegat. Legg merke til bruken av delegatforekomsten: Her har vi brukt + = -operatøren til å tilordne delegaten til flere metoder som har identiske signaturer.

bruker System;

navneområdet delegater

{

offentlig delegat ugyldig MyDelegate ();

klasse Program

    {

offentlig statisk ugyldighet Metode1 ()

        {

Console.WriteLine ("Inside Method1 ...");

        }

offentlig statisk tomrom Metod2 ()

        {

Console.WriteLine ("Inside Method2 ...");

        }

statisk tomrom Main ()

        {

MyDelegate d = null;

d + = Metode 1;

d + = Metode2;

d.Invoke ();

Console.ReadLine ();

        }

    }

}

Delegater er ideell for implementering av hendelsesdrevet programmering. En delegat trenger ikke å vite hvilken klasse objektet det henviser til. Alt det trenger å vite er signaturen til metoden den vil peke på. Riktig bruk av delegater kan fremme gjenbrukbarhet i koden din og fleksibilitet i designene dine. Du kan se Microsofts elektroniske dokumentasjon for mer informasjon om delegater.

$config[zx-auto] not found$config[zx-overlay] not found