Kako raditi s delegatima u C #

Delegat je pokazivač funkcije koji je siguran za tip i može se pozivati ​​na metodu koja ima isti potpis kao onaj delegata. Možete iskoristiti delegate u C # za implementaciju događaja i metode povratnog poziva. Delegat multicast-a je onaj koji može ukazati na jednu ili više metoda koje imaju identične potpise.

Razumijevanje delegata u C #

U osnovi, delegat drži referencu na metodu, a također i na ciljni objekt na kojem bi metoda trebala biti pozvana. Delegati u C # slični su pokazivačima na funkcije u C ++, ali delegati C # su sigurni za tip. Možete proslijediti metode kao parametre delegatu da biste delegatu omogućili da usmjeri na metodu. Delegati se koriste za definiranje metoda povratnog poziva i implementiranje rukovanja događajima, a deklariraju se pomoću ključne riječi "delegat". Možete proglasiti delegata koji se može pojaviti sam ili čak ugniježđen unutar klase.

Tri su koraka u korištenju delegata. To uključuje deklaraciju, instanciranje i pozivanje. 

Potpis delegata izgleda ovako:

delegirati identifikator tipa rezultata ([parametri])

Sljedeća izjava pokazuje kako možete proglasiti delegata.

javni delegat void MyDelegate (tekst niza);

Kao što možete vidjeti u gornjoj izjavi, ime delegata je "MyDelegate", ima povratnu vrstu "void" i prihvaća objekt niza kao argument. To podrazumijeva da delegat MyDelegate može ukazati na metodu koja ima identičan potpis. Ovo je ipak samo izjava - morate instancirati delegata prije nego što ga možete koristiti. Sljedeća izjava pokazuje kako možete instancirati gore deklarirani delegat.

MyDelegate d = novi MyDelegate (ShowText);

Nakon što deklarirate i napravite instancu delegata, možete se lako pozvati na metodu na koju delegat pokazuje.

d ("Pozdrav svijetu ...");

Ovdje je d delegatska instanca

Također možete pozvati metodu na koju upućuje instanca delegata pomoću metode Invoke () na instanci delegata kao što je prikazano u nastavku.

d.Poziv ("Pozdrav svijetu ...");

Ako imate metodu koja prihvaća dva broja, a želite ih dodati i vratiti zbroj dva broja, možete upotrijebiti delegat za pohranu povratne vrijednosti metode kako je prikazano u isječku koda koji je dat u nastavku.

int rezultat = d (12, 15);

Ovdje je potpuni popis kodova za vašu referencu.

pomoću sustava;

prostor imena Delegati

{

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

    razredni program

    {

      statički zbroj int (int x, int y)

        {

            povratak x + y;

        }

        statička praznina Glavna ()

        {

            MyDelegate d = novi MyDelegate (zbroj);           

            int rezultat = d.Pozvati (12, 15);

            Console.WriteLine (rezultat);

            Console.ReadLine ();

        }

    }

Delegati u akciji u C #

Evo kompletnog popisa kodova.

pomoću sustava;

prostor imena Delegati

{

    javni delegat void MyDelegate (tekst niza);

    razredni program

    {

        javna statička praznina ShowText (tekst niza)

        {

            Console.WriteLine (tekst);

        }

        statička praznina Glavna ()

        {

            MyDelegate d = novi MyDelegate (ShowText);

            d ("Pozdrav svijetu ...");

            Console.ReadLine ();

        }

    }

}

Primijetite da možete dodijeliti više objekata instanci delegata pomoću operatora +, što delegata čini delegatom višestrukog slanja. Također možete kombinirati instance delegata pomoću statičke metode Kombiniraj.

Runtime interno održava popis (koji se naziva i popis poziva) za izvršavanje više metoda. Sljedeći popis kodova pokazuje kako metodu Combine () možete kombinirati višestruke instance delegata.

myDelegate d1 = novi myDelegate (Metoda1);

myDelegate d2 = novi myDelegate (Metoda2);

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

multicastDelegate.Invoke ();

Delegat koji može upućivati ​​na više metoda poznat je kao delegat multicast-a. Primijetite da su instance delegata nepromjenjive. Dakle, kada kombinirate delegate ili oduzmete jednu instancu delegata s popisa, kreira se nova instanca delegata koja predstavlja ažurirani ili novi popis ciljeva ili metoda koje treba pozvati.

Multicast delegati u akciji u C #

Sljedeći popis kodova prikazuje multicast delegata. Obratite pažnju na upotrebu instance delegata: Ovdje smo koristili operator + = da dodijelimo delegat više metoda koje imaju identične potpise.

pomoću sustava;

prostor imena Delegati

{

    javni delegat void MyDelegate ();

    razredni program

    {

        javna statička praznina Method1 ()

        {

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

        }

        javna statička praznina Method2 ()

        {

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

        }

        statička praznina Glavna ()

        {

            MyDelegate d = null;

            d + = Metoda1;

            d + = Metoda2;

            d.Priziv ();

            Console.ReadLine ();

        }

    }

}

Delegati su idealni za provedbu programiranja vođenog događajima. Delegat ne mora znati klasu objekta na koji se odnosi. Sve što treba znati je potpis metode na koju bi upućivala. Pravilna upotreba delegata može promovirati ponovnu upotrebu vašeg koda i fleksibilnost u vašem dizajnu. Više informacija o delegatima potražite u Microsoftovoj internetskoj dokumentaciji.