事件和弱事件的示例解说

  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 }
时间: 2024-12-17 13:53:18

事件和弱事件的示例解说的相关文章

事件的示例解说

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("迈克尔"); // 这个类包含人名,以及一个响应事件的方法,事件参数类型是 Car

C#中的弱事件(Weak Events in C#)

(原创翻译文章·转载请注明来源:http://blog.csdn.net/hulihui) 原文:Weak Events In C#: Different approaches to weak events. by Daniel Grunwald.  Download source code - 15.5 KB 翻译前序 翻译后记 目录 引言 究竟什么是事件? 第1部分:监听方(Listener-side)的弱事件 解决方案0:仅仅注销 解决方案1:事件调用后注销 解决方案2:带弱引用(Weak

弱事件

----------------------------------------------------主程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication10 {     class Program     {         static void M

弱引用和弱事件

默認對象實例化後得到的都是強引用,不過有時候對於一些複雜的對象,出於性能考慮,并不希望進行頻繁的初始化,此時弱引用就可以派上用場. 用法:先用WeakReference包裝複雜對象,到需要該複雜對象的時候,檢查一下弱引用的IsAlive屬性,如果true,就可以通過Target直接得到複雜對象,省去了實例化的過程. 簡單的例子: static void Main(string[] args) { var weakRef = GetWeakRef(); GC.Collect(); if (weak

WPF 弱事件

因为在接触WPF的过程中追查INotifyPropertyChanged的通知原理的时候,发现了 PropertyChangedEventManager这个类,它是继承与WeakEventManager,也就是弱事件管理器,另外在学习MVVM的时候,其类库中也有关于弱引用弱事件方面的代码,然后我又非常的不熟悉,今天我打算深入了解下这个方面. 首先得了解下事件,事件在我的另外一篇里面已经详细讲了,这里就不重复了,但是事件其实有可能会导致内存泄露的,下面先看一个例子: 先申明一个Spy类,里面订阅按

[AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]

没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供了一种发布/订阅机制. 自定义事件:自定义一个类,继承EventArgs 使用泛型委托EventHandler<T>,本质:public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e) where  TEventHandle

WP8.1学习系列(第十九章)——事件和路由事件概述

我们将介绍在使用 C#.Visual Basic 或 Visual C++ 组件扩展 (C++/CX) 作为编程语言并使用 XAML 进行 UI 定义时,针对 Windows 运行时应用的事件的编程概念.你可以在 XAML 中的 UI 元素声明中为事件分配处理程序,或者在代码中添加处理程序.Windows 运行时支持路由事件:借助此功能,某些输入事件和数据事件可由引发该事件的对象以外的对象来处理.在定义控件模板或使用页面或版式容器时,路由事件十分有用. 事件即编程概念 通常而言,对 Window

由微服务,领域事件,分布式事件谈“业务分析三维度理论”的实践

今天读了在微服务中使用领域事件 这篇文章,通过分布式,订单系统直接将事件推送给订阅此事件的账户系统,然后账户系统再处理,整个系统设计很好. 不过,我觉得所谓微服务的分布式事件,从抽象概念上还是弱了点,不如Actor模型,应该将事件抽象成消息,消息包括命令,事件,或者其它无关紧要的东西.每一个Actor接收场景中的消息,或者产生消息,或者转发消息:消息如何处理,取决于Actor的内置规则. 所以,真实世界的模型是有很多场景,在某个场景中有些Actor,Actor相互交互,发生和改变什么东西.场景中

js原生创建模拟事件和自定义事件的方法

让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 1. 模拟鼠标事件 MDN上已经说得很清楚,尽管为了保持向后兼容MouseEvent.initMouseEvent()仍然可用,但是呢,我们应该使用MouseEvent().我们使用如下页面做测试 1 <!DOCTYPE html> 2 <html> 3 <head lang="zh-CN"> 4