delegate <return type> delegate-name(<parameter list>)
其中 return type 为返回值类型,delegate-name 为委托的名称,parameter list 为参数列表。提示:委托可以引用与委托具有相同签名的方法,也就是说委托在声明时即确定了委托可以引用的方法。
public delegate void printString(string s); // 声明一个委托
...
printString ps1 = new printString(WriteToScreen); // 实例化委托对象并将其与 WriteToScreen 方法关联
printString ps2 = new printString(WriteToFile); // 实例化委托对象并将其与 WriteToFile 方法关联
using System; delegate int NumberChanger(int n); // 定义委托 namespace task.lmcjl.com { class Demo { 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("num 的值为: {0}", getNum()); nc2(5); Console.WriteLine("num 的值为: {0}", getNum()); Console.ReadKey(); } } }运行结果如下:
num 的值为: 35
num 的值为: 175
+
运算符将多个对象分配给一个委托实例,同时还可以使用 -
运算符从委托中移除已分配的对象,当委托被调用时会依次调用列表中的委托。委托的这个属性被称为委托的多播,也可称为组播,利用委托的这个属性,您可以创建一个调用委托时要调用的方法列表。注意:仅可合并类型相同的委托。
下面通过示例程序演示委托的多播:using System; delegate int NumberChanger(int n); // 定义委托 namespace task.lmcjl.com { class Demo { 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("num 的值为: {0}", getNum()); Console.ReadKey(); } } }运行结果如下:
num 的值为: 75
【示例】下面定义一个委托 printString,我们使用这个委托来调用两个方法,第一个把字符串打印到控制台,第二个把字符串打印到文件:using System; using System.IO; namespace task.lmcjl.com { class Demo { 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("./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("C语言中文网"); } static void Main(string[] args){ printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); sendString(ps1); sendString(ps2); Console.ReadKey(); } } }运行上面的代码会在程序所在的目录下生成一个名为 message.txt 的文件,并输出一下内容:
The String is: C语言中文网
本文链接:http://task.lmcjl.com/news/15756.html