码迷,mamicode.com
首页 > 其他好文 > 详细

事件的示例解说

时间:2016-01-23 21:24:32      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

 1 using System;
 2 
 3 namespace ConsoleApplication7
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             var dealer = new CarDealer(); // 这个类包含一个事件处理器,以及对其的调用方法
10 
11             var michael = new Consumer("迈克尔"); // 这个类包含人名,以及一个响应事件的方法,事件参数类型是 CarInfoEventArgs
12             dealer.NewCarInfo += michael.NewCarIsHere; // 通过在事件处理器上注册(类实例包含的)响应事件方法
13 
14             dealer.NewCar("法拉利"); // 执行事件处理器
15 
16             var sebastian = new Consumer("瑟巴斯天");
17             dealer.NewCarInfo += sebastian.NewCarIsHere;
18 
19             dealer.NewCar("美瑟德斯");
20 
21             dealer.NewCarInfo -= michael.NewCarIsHere;
22 
23             dealer.NewCar("红牛竞赛");
24 
25             Console.ReadKey();
26         }
27     }
28 
29     // 事件系统的总体思路
30     // 通过事件提醒委托(事件处理器)(第1个模型,管理参数定义和方法注册的事件委托)来激活事件响应方法(第2个模型,接收提醒和数据的方法)
31     // 两者之间应该有统一的参数约定,以此来传递数据,这个参数就是事件参数(第3个模型,包含数据的类)
32     // 它们的整体通过泛型事件处理器 EventHandler<TEventArgs> 的实例来调用,用法是 eventHandler(object sender, TEventArgs e)
33     // sender 通常是事件执行者的类,用来传递执行者的信息,e 则是事件参数,包含它自定义的数据(通常是属性)
34     // 通过在事件处理器上添加对事件响应方法的注册(取消),来关联起双方,运算符是 += / -=
35 
36     public class Consumer
37     {
38         private string name;
39 
40         public Consumer(string name)
41         {
42             this.name = name;
43         }
44 
45         // 2 这是个事件响应方法,第二个参数决定了事件参数类型,以匹配相同参数的事件处理器
46         public void NewCarIsHere(object sender, CarInfoEventArgs e)
47         {
48             Console.WriteLine("{0}: 汽车 {1} 新到达! 事件执行者: {2}",name,e.Car,sender.ToString());
49         }
50     }
51 
52     // 3 这是个事件参数,用于连接事件处理器和事件响应方法,以传递数据
53     // 它以 Car 属性来储存数据
54     public class CarInfoEventArgs : EventArgs
55     {
56         // 该事件参数的构造函数接收 string 类型参数,并将其储存为属性 Car
57         public CarInfoEventArgs(string car)
58         {
59             this.Car = car;
60         }
61 
62         public string Car { get; private set; }
63     }
64 
65     public class CarDealer
66     {
67         // 1 这是个事件提醒委托,称作事件处理器,需要定义事件参数类型
68         public event EventHandler<CarInfoEventArgs> NewCarInfo;
69 
70         public void NewCar(string car)
71         {
72             Console.WriteLine("汽车供应商: 新车 {0}", car);
73 
74             RaiseNewCarInfo(car);
75             Console.WriteLine();
76         }
77 
78         // 这是一个普通方法,要求接收 string 类型参数
79         // 并把 string 参数传递给事件参数,然后通过具有相同事件类型的事件处理器,来执行事件
80         protected virtual void RaiseNewCarInfo(string car)
81         {
82             EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
83             if(newCarInfo != null)
84             {
85                 newCarInfo(this, new CarInfoEventArgs(car));
86             }
87         }
88     }
89 }

 

事件的示例解说

标签:

原文地址:http://www.cnblogs.com/caies/p/5153886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!