事件的示例解说

 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 }
时间: 2024-10-11 14:35:10

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

事件和弱事件的示例解说

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("

Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习Guava EventBus(一)EventBus,我们简单的对Guava基于事件的编程进行了介绍,学习和了解了EventBus类的使用,本篇起,我们通过一系列的示例代码深入的学习EventBus类,本篇学习Guava EventBus(二)EventBus 事件订阅示例.     订阅Subscribe 首先,我们假定定义了如下所示的TradeAccountEvent类

《C#高级编程》委托、事件的示例代码

运行结果: Program.cs 1 using System; 2 3 namespace Wrox.ProCSharp.Delegates 4 { 5 class Program 6 { 7 static void Main() 8 { 9 var dealer = new CarDealer(); 10 11 var michael = new Consumer("Michael"); 12 dealer.NewCarInfo += michael.NewCarIsHere; 1

c# 使用hook来监控鼠标键盘事件的示例代码

如果这个程序在10几年前,QQ刚刚兴起的时候,有了这个代码,就可实现盗号了. 当然使用钩子我们更多的是实现"全局快捷键"的需求. 比如 程序最小化隐藏后要"某快捷键"来启动它. 钩子(hook),通俗的讲,她可以捕获到你的键盘和鼠标的相关操作消息. 关于hook的相关代码网上一搜一箩筐,这是整理起来比较完善和使用最方便的. //Declare wrapper managed POINT class. [StructLayout(LayoutKind.Sequenti

jQuery之事件和批量操作、事件委托示例

一.常用事件 click(function(){...}) // 点击时触发 focus(function(){...}) // 获得焦点触发 blur(function(){...}) // 失去焦点触发 change(function(){...}) // 内容改变后触发 keyup(function(){...}) // 键盘按下后触发 keydown(function(){...}) // 键盘放开后触发 hover(function(){...},function(){...}) //

js阻止冒泡及jquery阻止事件冒泡示例介绍

js阻止冒泡 在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做以下兼容. 复制代码 代码如下: function stopPro(evt){ var e = evt || window.event; //returnValue如果设置了该属性,它的值比事件句柄的返回值优先级高.把这个属性设置为 fasle, //可以取消发生事件的源元素的默认动作. //window.event?e.returnValue = false:e.preventDefault(); window.ev

响应事件的示例

示例 1 onmousedown, onmouseup <script> function textcolor(cursor, i){ if(i ==0) cursor.style.color ="#0000FF"; else cursor.style.color ="#E7D745"; } </script> <h2 onmouseup="textcolor(this,1)" onmousedown="t

程序员如何应对北上广高房价示例解说建造者模式

一.前言 最近北上广的房价蹭蹭的往上涨,如果你不买房房价再高和你一点毛关系都没有:但是大多数的人还是要面临买房子的. 北上广IT创业比重还是相当高的,所以众多的程序员面临着贵如天价的房子,有苦说不出. 无论房价怎么的涨,无论房价怎么的高,我们写程序的要笑对生活:要热爱工作,热爱人民,热爱社会主义,始终拥护党的领导! 扯房子扯的有点远了,我们下面回归今天的重点-建造者模式. 二.基本概念 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不

esper 事件引擎,各种事件类型示例代码

原创文章 转载请注明出处 package com.hp.iot.engine.esper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; import com.espertech.esper.client.EPAdministrator; import com.espertech