![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 namespace learn.Sample 2 { 3 public delegate void DoGreeting(string name);//声明一个委托 4 public class ManagerHello 5 { 6 public event DoGreeting MakeGreet;//声明一个事件 7 public void GreetHello(string name)//声明一个方法 8 { 9 MakeGreet(name); 10 } 11 } 12 13 } 14 15 namespace learn 16 { 17 public class Program 18 { 19 private static void EnglishGreeting(string name) 20 { 21 Console.WriteLine("Hello," + name); 22 } 23 private static void ChineseGreeting(string name) 24 { 25 Console.WriteLine("你好," + name); 26 } 27 static void Main(string[] args) 28 { 29 ManagerHello manager = new ManagerHello();//实例化ManagerHello类 30 //manager.MakeGreet += new DoGreeting(EnglishGreeting); 31 //manager.MakeGreet += new DoGreeting(ChineseGreeting); 32 manager.MakeGreet += EnglishGreeting;//为类的事件注册方法 33 manager.MakeGreet += ChineseGreeting; 34 manager.GreetHello("小王");//调用manager对象中的方法 35 36 //那么在这里我便可以这么理解: 37 //被委托方是:manager实例对象,委托方:DoGreeting,那么我通过事件MakeGreet将委托方和被委托放衔接起来,被委托方委托委托方来通过事件MakeGreet来执行EnglishGreeting和ChineseGeeting这两件事情 38 } 39 } 40 }
委托和事件的关系,希望通过这个例子能够更加简单更加清晰的去认识它们之间的关系
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if-else,switch语句,同时使程序具有更好的扩展性
注意这里的关键几点:
① 委托是一个类,那么委托具有类的特性,在声明类的地方同样能够声明委托
② 可以作为参数来使用,这中性质类同样是有的,我们同样可以把一个类来当作参数来使用的。例如我们可以把一个实体类当作一个参数来使用,那么传递的时候我们就可以用这个类来进行处理。那么,类似的我们可以通过使用委托,把委托作为参数来使用,那么这个时候我们就可以通过委托,来注册到委托中的方法,进行我们想要的操作。
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量是(这里用“调用”这个次,是因为此变量代表一个方法),可以依次调用所有绑定的方法
委托没有0个参数的重载,因此在实例化的时候至少要有一个参数,否则编译将无法通过
声明一个事件类似于声明一个进行了封装的委托类型的变量