标签:
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