委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种方法动态地给参数赋值的做法,可以避免在程序中大量使用if-else(switch)语句,同时具有更好的可扩展性。
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name) {
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一个GreetingDelegate类型的方法作为参数
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
static void Main(string[] args) {
GreetPeople("Han", EnglishGreeting);
GreetPeople("韩", ChineseGreeting);
Console.ReadKey();
}
}
}
输出如下:
Morning, Han
早上好, 韩
所以也可以这样赋值
string name1,name2;
name1 = "Han";
name2 = "韩";
GreetPeople(name1,EnglishGreeting);
GreetPeople(name2,ChineseGreeting);
Console.ReadKey();
既然委托GreetingDelegage和类型string地位一样,都是定义了一种参数类型,那么
static void Main(string[] args)
{
GreetingDelegate delegate1,delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;
GreetPeople("Han",delegate1);
GreetPeople("韩",delegate2);
Console.ReadKey();
}
委托不同于string,可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用所绑定的方法。
static void Main(string[] args)
{
GreetingDelegate delegate1;
delegate1 = EnglishGreeting;//先给委托类型的变量赋值
delegate1 += ChineseGreeting;//给委托变量再绑定一个方法
//先后调用两个方法
GreetPeople("Han",delegate1);
Console.ReadKey();
}
输出为:
Morning,Han
早上好,韩
或者,也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值(这里注意,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。)
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
delegate1 ("Jimmy Zhang");
Console.ReadKey();
}