Rumah > Artikel > pembangunan bahagian belakang > Terangkan konsep delegasi dalam C#
Jika anda seorang pengaturcara C, anda boleh menganggap perwakilan sebagai penunjuk kepada fungsi. Walau bagaimanapun, perwakilan dalam C# adalah lebih daripada sekadar penunjuk fungsi mudah. Artikel ini menerangkan konsep delegasi dan penggunaannya dalam pengaturcaraan harian.
Pada asasnya, delegasi memberikan tahap tidak arah. Mereka merangkum sekeping kod yang boleh dihantar dan dilaksanakan dengan cara yang selamat jenis. Daripada melakukan tingkah laku serta-merta, ia terkandung dalam objek. Anda boleh melakukan beberapa operasi pada objek ini, salah satunya adalah untuk melaksanakan tingkah laku yang terkandung.
Menggunakan perwakilan membolehkan kami menulis fungsi tertib lebih tinggi, iaitu fungsi yang boleh menerima fungsi sebagai parameter atau mengembalikan fungsi sebagai nilai pulangan. Jenis perwakilan mentakrifkan tandatangan kaedah yang boleh diwakili oleh perwakilan, khususnya jenis pemulangan kaedah dan jenis parameternya. Dalam contoh berikut, Transformer ialah perwakilan yang boleh mewakili sebarang kaedah yang menerima dan mengembalikan integer.
delegate int Transformer(int x);
Kami boleh menetapkan sebarang kaedah (termasuk lambda, contoh atau kaedah statik) kepada tika Transformer yang memenuhi tandatangan. Contohnya -
Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125
Perwakilan biasanya digunakan apabila kod yang ingin melaksanakan operasi tertentu tidak mengetahui butiran operasi tersebut tetapi mengetahui antara muka untuk operasi tersebut. p>
Dalam pengaturcaraan, kita sering menghadapi situasi di mana kita perlu melakukan operasi tertentu, tetapi kita tidak tahu terlebih dahulu kaedah mana yang perlu dipanggil untuk melaksanakannya. Wakil membantu kami menyelesaikan masalah ini dengan menggantikan tingkah laku dengan perwakilan dan kemudian memberikan contoh konkrit perwakilan dengan tingkah laku yang sesuai mengikut konteks dan situasi yang diperlukan.
Untuk membolehkan perwakilan melakukan apa sahaja, empat perkara perlu berlaku -
Jenis perwakilan pada asasnya ialah takrifan fungsi yang diwakilinya, iaitu ia terdiri daripada parameter, jenis yang akan diterima oleh fungsi dan jenis pemulangan yang dipulangkan.
Sebagai contoh, jenis perwakilan yang mewakili kaedah yang menerima dua nombor sebagai input dan mengembalikan nombor boleh diisytiharkan sebagai -
delegate int Processor(int numOne, int numTwo);
Pemproses ialah jenis, serupa dengan jenis yang dicipta oleh kelas. Untuk mencipta contoh jenis ini, anda memerlukan kaedah yang menerima dua nombor sebagai input dan mengembalikan nilai boolean.
2) Kod yang hendak dilaksanakan mesti terkandung dalam kaedah.
Tentukan kaedah dengan tandatangan yang sama seperti jenis perwakilan di atas dan lakukan apa yang anda mahu bergantung pada situasi masa jalan. Sebagai contoh, mana-mana kaedah berikut boleh digunakan untuk mencipta tika Pemproses kerana kesemuanya mengambil dua nombor dan mengembalikan nombor.
static int Add(int numOne, int numTwo){ Return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ Return numOne - numTwo; }
Sekarang anda mempunyai jenis perwakilan dan kaedah dengan tandatangan yang betul, anda boleh membuat contoh jenis perwakilan itu. Apabila melakukan ini, kami pada dasarnya memberitahu pengkompil C# untuk melaksanakan kaedah ini apabila contoh perwakilan dipanggil.
Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract);
Contoh di atas menganggap bahawa kaedah Tambah dan Tolak ditakrifkan dalam kelas yang sama di mana kita mencipta contoh perwakilan. Jika kaedah ini ditakrifkan dalam kelas yang berbeza, kami memerlukan contoh kelas itu.
Ini hanya memanggil kaedah pada contoh perwakilan, tanpa menghairankan dinamakan Invoke. Kaedah pada contoh perwakilan ini mempunyai senarai parameter dan jenis pulangan yang sama seperti yang ditentukan oleh pengisytiharan jenis perwakilan. Memanggil Invoke akan melaksanakan operasi contoh perwakilan.
int sum = processorOne.Invoke(3, 5);
Tetapi, C# menjadikannya lebih mudah. Anda boleh memanggil contoh perwakilan secara langsung seolah-olah ia adalah kaedah itu sendiri. Contohnya,
int difference = processorTwo(10, 6);
Jika kami ingin melakukan satu siri operasi berbeza dengan satu panggilan contoh perwakilan, C# membenarkan kami melakukan ini. sistem. Jenis perwakilan mempunyai dua kaedah statik yang dipanggil Combine dan Remove.
Mencipta perwakilan baharu dengan senarai panggilan yang menggabungkan senarai panggilan wakil yang diluluskan sebagai hujah. Apabila tika perwakilan baharu dipanggil, semua operasinya dilakukan secara berurutan.
public static Delegate Combine(params Delegate[] delegates); // OR public static Delegate Combine(Delegate a, Delegate b);
Jika sebarang operasi dalam senarai panggilan memberikan pengecualian, ia akan menghalang sebarang operasi berikutnya daripada dilaksanakan.
Alih keluar kejadian terakhir senarai panggilan perwakilan daripada senarai panggilan perwakilan lain. Mengembalikan perwakilan baharu yang mengandungi senarai panggilan yang dibentuk dengan mengambil senarai panggilan sumber dan mengalih keluar kejadian terakhir senarai panggilan nilai.
public static Delegate Remove(Delegate source, Delegate value);
Seorang perwakilan merangkum gelagat menggunakan jenis dan set parameter tertentu, serupa dengan antara muka kaedah tunggal.
Tandatangan jenis yang diterangkan oleh pengisytiharan jenis perwakilan menentukan kaedah yang boleh digunakan untuk membuat contoh perwakilan dan tandatangan panggilan.
Mencipta contoh perwakilan memerlukan kaedah yang ingin kita laksanakan apabila perwakilan dipanggil.
Adegan perwakilan tidak boleh diubah, serupa dengan rentetan.
Setiap contoh perwakilan mengandungi senarai panggilan - senarai operasi.
Adegan perwakilan boleh digabungkan dan dipadamkan antara satu sama lain.
Demonstrasi masa nyata
using System; class Program{ delegate int Transformer(int x); delegate int Processor(int numOne, int numTwo); static void Main(){ Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125 Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract); int sum = processorOne.Invoke(3, 5); Console.WriteLine(sum); // prints 8 int difference = processorTwo(10, 6); Console.WriteLine(difference); // prints 4 } static int Add(int numOne, int numTwo){ return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ return numOne - numTwo; } }
9 125 8 4
Atas ialah kandungan terperinci Terangkan konsep delegasi dalam C#. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!