委托与事件

 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 }
event and delegate

委托和事件的关系,希望通过这个例子能够更加简单更加清晰的去认识它们之间的关系

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if-else,switch语句,同时使程序具有更好的扩展性

注意这里的关键几点:

① 委托是一个类,那么委托具有类的特性,在声明类的地方同样能够声明委托

② 可以作为参数来使用,这中性质类同样是有的,我们同样可以把一个类来当作参数来使用的。例如我们可以把一个实体类当作一个参数来使用,那么传递的时候我们就可以用这个类来进行处理。那么,类似的我们可以通过使用委托,把委托作为参数来使用,那么这个时候我们就可以通过委托,来注册到委托中的方法,进行我们想要的操作。

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量是(这里用“调用”这个次,是因为此变量代表一个方法),可以依次调用所有绑定的方法

委托没有0个参数的重载,因此在实例化的时候至少要有一个参数,否则编译将无法通过

声明一个事件类似于声明一个进行了封装的委托类型的变量

原文地址:https://www.cnblogs.com/itboy-2009/p/4279300.html