Ohjelmointi

Kuinka työskennellä C #: n edustajien kanssa

Edustaja on tyyppikohtainen toimintoosoitin, joka voi viitata menetelmään, jolla on sama allekirjoitus kuin edustajan. Voit hyödyntää C #: n edustajia tapahtumien ja takaisinsoittomenetelmien toteuttamiseksi. Monilähetysvaltuutettu on sellainen, joka voi osoittaa yhden tai useampia menetelmiä, joilla on identtiset allekirjoitukset.

C #: n edustajien ymmärtäminen

Periaatteessa edustajalla on viittaus menetelmään ja myös kohdeobjektiin, johon menetelmää tulisi kutsua. C #: n edustajat ovat samanlaisia ​​kuin C ++: n funktion osoittimet, mutta C #: n edustajat ovat tyypiltään turvallisia. Voit välittää menetelmät parametreina edustajalle, jotta edustaja voi osoittaa menetelmään. Edustajia käytetään määrittelemään takaisinsoittomenetelmät ja toteuttamaan tapahtumien käsittely, ja ne ilmoitetaan käyttämällä ”delegate” -avainsanaa. Voit julistaa edustajan, joka voi esiintyä yksin tai jopa sisäkkäin luokan sisällä.

Edustajien käyttämisessä on kolme vaihetta. Näitä ovat ilmoitus, välitön käyttö ja kutsuminen.

Edustajan allekirjoitus näyttää tältä:

delegoi tulos-tyypin tunniste ([parametrit])

Seuraava lausunto osoittaa, miten voit julistaa edustajan.

julkinen edustaja void MyDelegate (merkkijono);

Kuten yllä olevasta lauseesta näet, edustajan nimi on "MyDelegate", sen palautustyyppi on "void", ja se hyväksyy merkkijono-objektin argumenttina. Tämä tarkoittaa, että edustaja MyDelegate voi osoittaa menetelmään, jolla on sama allekirjoitus. Tämä on kuitenkin vain julistus - sinun on kerrottava edustaja ennen kuin voit käyttää sitä. Seuraavaksi annettu lausunto osoittaa, kuinka voit selvittää yllä ilmoitetun edustajan.

MyDelegate d = uusi MyDelegate (ShowText);

Kun olet ilmoittanut ja valtuuttanut edustajan, voit käyttää menetelmää, johon edustaja viittaa helposti.

d ("Hei maailma ...");

Tässä d on edustajan esiintymä

Voit myös kutsua menetelmän, johon edustajainstanssi viittaa, käyttämällä Invoke () -menetelmää edustajainstanssissa alla olevan kuvan mukaisesti.

d.Invoke ("Hei maailma ...");

Jos sinulla on menetelmä, joka hyväksyy kaksi numeroa ja haluat lisätä ne ja palauttaa kahden numeron summan, voit tallentaa edustajan avulla menetelmän palautusarvon alla olevan koodinpätkän mukaisesti.

int tulos = d (12, 15);

Tässä on täydellinen koodiluettelo viitteellesi.

käyttämällä järjestelmää;

nimitila Edustajat

{

julkinen edustaja int MyDelegate (int x, int y);

luokan ohjelma

    {

staattinen int summa (int x, int y)

        {

paluu x + y;

        }

staattinen void Main ()

        {

MyDelegate d = uusi MyDelegate (summa);

int tulos = d. puhelu (12, 15);

Console.WriteLine (tulos);

Console.ReadLine ();

        }

    }

Edustajat C #: ssä

Tässä on täydellinen koodiluettelo.

käyttämällä järjestelmää;

nimitila Edustajat

{

julkinen edustaja void MyDelegate (merkkijono);

luokan ohjelma

    {

public static void ShowText (merkkijonoteksti)

        {

Console.WriteLine (teksti);

        }

staattinen void Main ()

        {

MyDelegate d = uusi MyDelegate (ShowText);

d ("Hei maailma ...");

Console.ReadLine ();

        }

    }

}

Huomaa, että voit määrittää useita objekteja edustajainstanssille + -operaattorin avulla, mikä tekee edustajasta monilähetysvaltuutetun. Voit myös yhdistää edustajien esiintymiä staattisella yhdistämistavalla.

Ajonaikainen ylläpitää sisäisesti luetteloa (kutsutaan myös kutsulistaksi) useiden menetelmien suorittamiseksi. Seuraava koodiluettelo näyttää, kuinka voit yhdistää () -menetelmän yhdistää useita edustajia.

myDelegate d1 = uusi myDelegate (menetelmä 1);

myDelegate d2 = uusi myDelegate (menetelmä 2);

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

multicastDelegate.Invoke ();

Edustaja, joka voi osoittaa useita menetelmiä, tunnetaan ryhmälähetysvaltuutettuna. Huomaa, että edustajien esiintymät ovat muuttumattomia. Joten kun yhdistät edustajia tai vähennät yhden edustajan ilmentymän luettelosta, luodaan uusi edustajainstanssi, joka edustaa päivitettyä tai uutta luetteloa käytetyistä kohteista tai menetelmistä.

Monilähetysvaltuutetut toiminnassa C #

Seuraava koodiluettelo kuvaa ryhmälähetysvaltuutettua. Huomaa valtuutetun esiintymän käyttö: Tässä olemme käyttäneet + = -operaattoria osoittamaan edustajan useille menetelmille, joilla on identtiset allekirjoitukset.

käyttämällä järjestelmää;

nimitila Edustajat

{

julkinen edustaja mitätöi MyDelegate ();

luokan ohjelma

    {

julkinen staattinen void Method1 ()

        {

Console.WriteLine ("Sisäinen menetelmä1 ...");

        }

julkinen staattinen void Method2 ()

        {

Console.WriteLine ("Sisäinen menetelmä2 ...");

        }

staattinen void Main ()

        {

MyDelegate d = nolla;

d + = menetelmä 1;

d + = menetelmä 2;

d. puhelu ();

Console.ReadLine ();

        }

    }

}

Edustajat soveltuvat ihanteellisesti tapahtumavetoisen ohjelmoinnin toteuttamiseen. Edustajan ei tarvitse tietää objektin luokkaa, johon se viittaa. Sen on vain tiedettävä sen menetelmän allekirjoitus, johon se viittaa. Edustajien asianmukainen käyttö voi edistää koodisi uudelleenkäytettävyyttä ja suunnittelun joustavuutta. Lisätietoja edustajista saat Microsoftin online-ohjeista.