Cara bekerja dengan perwakilan di C #

Perwakilan adalah penunjuk fungsi selamat-jenis yang dapat merujuk kaedah yang mempunyai tanda tangan yang sama dengan perwakilan. Anda boleh memanfaatkan delegasi di C # untuk melaksanakan acara dan kaedah panggilan balik. Perwakilan multicast adalah salah satu yang dapat menunjukkan satu atau lebih kaedah yang mempunyai tanda tangan yang sama.

Memahami perwakilan dalam C #

Pada hakikatnya, seorang perwakilan memegang rujukan ke suatu kaedah dan juga ke objek sasaran di mana kaedah itu harus dipanggil. Perwakilan di C # serupa dengan penunjuk fungsi di C ++, tetapi perwakilan C # adalah jenis selamat. Anda boleh menyampaikan kaedah sebagai parameter kepada perwakilan untuk membolehkan perwakilan menunjuk ke kaedah tersebut. Delegasi digunakan untuk menentukan metode panggilan balik dan melaksanakan penanganan acara, dan mereka dinyatakan menggunakan kata kunci "delegasi". Anda boleh menyatakan perwakilan yang boleh muncul sendiri atau bahkan bersarang di dalam kelas.

Terdapat tiga langkah dalam menggunakan perwakilan. Ini termasuk deklarasi, instansiasi, dan pemanggilan. 

Tandatangan perwakilan kelihatan seperti ini:

perwakilan jenis hasil keputusan ([parameter])

Pernyataan berikut menunjukkan bagaimana anda boleh menyatakan perwakilan.

perwakilan awam membatalkan MyDelegate (teks rentetan);

Seperti yang anda lihat dalam pernyataan di atas, nama perwakilan adalah "MyDelegate", ia memiliki jenis pengembalian "batal", dan ia menerima objek rentetan sebagai argumen. Ini menunjukkan bahawa perwakilan MyDelegate dapat menunjukkan kaedah yang mempunyai tanda tangan yang sama. Ini hanyalah deklarasi - anda mesti memberi perwakilan sebelum anda dapat menggunakannya. Pernyataan yang diberikan seterusnya menunjukkan bagaimana anda dapat menunjukkan perwakilan yang dinyatakan di atas.

MyDelegate d = MyDelegate baru (ShowText);

Setelah anda menyatakan dan membuat perwakilan, anda boleh menggunakan kaedah yang mudah ditunjukkan oleh perwakilan.

d ("Hello World ...");

Di sini, d adalah contoh perwakilan

Anda juga boleh menggunakan kaedah yang ditunjukkan oleh instance delegasi menggunakan kaedah Invoke () pada instance delegasi seperti yang ditunjukkan di bawah.

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

Sekiranya anda mempunyai kaedah yang menerima dua nombor dan anda ingin menambahkannya dan mengembalikan jumlah kedua nombor tersebut, anda boleh menggunakan perwakilan untuk menyimpan nilai kembali kaedah seperti yang ditunjukkan dalam potongan kod yang diberikan di bawah.

hasil int = d (12, 15);

Berikut adalah senarai kod lengkap untuk rujukan anda.

menggunakan Sistem;

Perwakilan ruang nama

{

    perwakilan awam int MyDelegate (int x, int y);

    Program kelas

    {

      jumlah int statik (int x, int y)

        {

            pulangan x + y;

        }

        kekosongan statik Utama ()

        {

            MyDelegate d = MyDelegate baru (Jumlah);           

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

            Console.WriteLine (hasil);

            Konsol.ReadLine ();

        }

    }

Perwakilan beraksi di C #

Berikut adalah senarai kod yang lengkap.

menggunakan Sistem;

Perwakilan ruang nama

{

    perwakilan awam membatalkan MyDelegate (teks rentetan);

    Program kelas

    {

        ShowText kekosongan statik awam (teks rentetan)

        {

            Console.WriteLine (teks);

        }

        kekosongan statik Utama ()

        {

            MyDelegate d = MyDelegate baru (ShowText);

            d ("Hello World ...");

            Konsol.ReadLine ();

        }

    }

}

Perhatikan bahawa anda dapat menetapkan beberapa objek ke instance delegasi menggunakan operator +, yang menjadikan delegasi sebagai delegasi multicasting. Anda juga boleh menggabungkan contoh perwakilan menggunakan kaedah statik Gabungan.

Waktu berjalan mengekalkan senarai (juga disebut senarai Permintaan) secara dalaman untuk melaksanakan pelbagai kaedah. Penyenaraian kod berikut menunjukkan bagaimana anda boleh menggunakan kaedah Gabungkan () untuk menggabungkan beberapa contoh perwakilan.

myDelegate d1 = myDelegate baru (Kaedah1);

myDelegate d2 = myDelegate baru (Kaedah2);

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

multicastDelegate.Invoke ();

Perwakilan yang boleh menunjukkan pelbagai kaedah dikenali sebagai perwakilan multikast. Perhatikan bahawa contoh perwakilan tidak dapat diubah. Oleh itu, apabila anda menggabungkan perwakilan atau tolak satu contoh perwakilan dari senarai, contoh perwakilan baru dibuat untuk mewakili senarai sasaran atau kaedah yang diperbaharui atau baru untuk dipanggil.

Perwakilan multicast beraksi di C #

Penyenaraian kod berikut menggambarkan perwakilan multicast. Perhatikan penggunaan contoh perwakilan: Di sini kami telah menggunakan operator + = untuk menetapkan perwakilan ke beberapa kaedah yang mempunyai tanda tangan yang sama.

menggunakan Sistem;

Perwakilan ruang nama

{

    perwakilan awam membatalkan MyDelegate ();

    Program kelas

    {

        Kaedah tidak sah statik awam1 ()

        {

            Console.WriteLine ("Kaedah Dalam1 ...");

        }

        Kaedah tidak sah statik awam2 ()

        {

            Console.WriteLine ("Kaedah Dalam 2 ...");

        }

        kekosongan statik Utama ()

        {

            MyDelegate d = null;

            d + = Kaedah1;

            d + = Kaedah2;

            d. Meminta ();

            Konsol.ReadLine ();

        }

    }

}

Delegasi sangat sesuai untuk melaksanakan pengaturcaraan berdasarkan acara. Seorang perwakilan tidak perlu mengetahui kelas objek yang menjadi rujukannya. Yang perlu diketahui adalah tandatangan kaedah yang akan ditunjukkan. Penggunaan perwakilan yang betul dapat meningkatkan penggunaan semula dalam kod anda dan fleksibiliti dalam reka bentuk anda. Anda boleh merujuk kepada dokumentasi dalam talian Microsoft untuk maklumat lebih lanjut mengenai perwakilan.