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

事件和弱事件的示例解说

时间:2016-01-24 00:35:49      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

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

 

事件和弱事件的示例解说

标签:

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

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