C# Perwakilan
Pewakilan dalam C# adalah serupa dengan penuding kepada fungsi dalam C atau C++. Delegate ialah pembolehubah jenis rujukan yang memegang rujukan kepada kaedah. Rujukan boleh ditukar semasa masa jalan.
Delegasi digunakan terutamanya untuk melaksanakan acara dan kaedah panggil balik. Semua perwakilan (Delegasi) berasal daripada kelas System.Delegate.
Pengisytiharan Perwakilan (Perwakilan)
Perisytiharan perwakilan menentukan kaedah yang boleh dirujuk oleh perwakilan. Seorang perwakilan boleh menunjuk kepada kaedah dengan label yang sama dengan kaedah tersebut.
Sebagai contoh, katakan ada perwakilan:
public delegate int MyDelegate (string s);
Perwakilan di atas boleh digunakan untuk merujuk mana-mana kaedah yang mengambil satu parameter rentetan dan mengembalikan int jenis pembolehubah.
Sintaks untuk mengisytiharkan perwakilan adalah seperti berikut:
delegate <return type> <delegate-name> <parameter list>
Memasang perwakilan (Delegasi)
Setelah jenis perwakilan diisytiharkan, objek perwakilan mesti menggunakan kata kunci baharu untuk dibuat dan dikaitkan dengan kaedah tertentu. Apabila membuat perwakilan, parameter yang dihantar kepada pernyataan baharu ditulis sama seperti panggilan kaedah, tetapi tanpa parameter. Contohnya:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
Contoh berikut menunjukkan pengisytiharan, instantiasi dan penggunaan perwakilan, yang boleh digunakan untuk merujuk kaedah yang mengambil parameter integer dan mengembalikan nilai integer.
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 创建委托实例 NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); // 使用委托对象调用方法 nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Value of Num: 35 Value of Num: 175
Pendaraban Perwakilan
Objek perwakilan boleh digunakan operator "+" untuk penggabungan. Perwakilan gabungan memanggil dua perwakilan yang digabungkan. Hanya perwakilan daripada jenis yang sama boleh digabungkan. Pengendali "-" boleh digunakan untuk mengalih keluar perwakilan komponen daripada perwakilan gabungan.
Menggunakan ciri perwakilan yang berguna ini, anda boleh membuat senarai panggilan kaedah untuk dipanggil apabila perwakilan dipanggil. Ini dipanggil penyaluran berbilang yang diwakilkan, juga dipanggil berbilang siaran. Program berikut menunjukkan multicasting perwakilan:
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 创建委托实例 NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2; // 调用多播 nc(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Value of Num: 75
Tujuan Perwakilan
Contoh berikut menunjukkan penggunaan delegasi. Perwakilan printString boleh digunakan untuk merujuk kaedah yang mengambil rentetan sebagai input dan tidak mengembalikan apa-apa.
Kami menggunakan perwakilan ini untuk memanggil dua kaedah, yang pertama mencetak rentetan ke konsol, yang kedua mencetak rentetan ke fail:
using System; using System.IO; namespace DelegateAppl { class PrintString { static FileStream fs; static StreamWriter sw; // 委托声明 public delegate void printString(string s); // 该方法打印到控制台 public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } // 该方法打印到文件 public static void WriteToFile(string s) { fs = new FileStream("c:\message.txt", FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); sw.WriteLine(s); sw.Flush(); sw.Close(); fs.Close(); } // 该方法把委托作为参数,并使用它调用方法 public static void sendString(printString ps) { ps("Hello World"); } static void Main(string[] args) { printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); sendString(ps1); sendString(ps2); Console.ReadKey(); } } }
Apabila kod di atas disusun dan apabila dilaksanakan, ia menghasilkan keputusan berikut:
The String is: Hello World