[转] 自定义事件

简介:

DebugLZQ 原文.NET自定义事件小结

关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了。

用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了。描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量。下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
 
namespace  自定义事件
{
     //http://www.cnblogs.com/DebugLZQ
     //自定义事件步骤的示例代码
 
     //0.定义事件传递的参数
     class  AlarmEventArgs : EventArgs
     {
         public   int  numberOfThief;
         public  AlarmEventArgs( int  n)
         {
             numberOfThief = n;
         }
     }
     //事件的发出者
     class  Dog
     {
         //1.声明事件的委托
         public  delegate  void  AlarmEventHandler(Object sender, AlarmEventArgs e);
         //2.声明事件
         public  event  AlarmEventHandler Alarm;
         //3.引发事件的函数
         public  void  OnAlarm(AlarmEventArgs e)
         {
             if  ( this .Alarm !=  null )
             {
                 Console.WriteLine( "The dog is Wangwang..." );
                 this .Alarm( this , e);               
             }
         }
     }
     //事件的订阅者
     class  Host
     {
         //4.订阅事件
         public  Host(Dog dog)
         {
             dog.Alarm +=  new  Dog.AlarmEventHandler(HostHandleEvent);
         }
         //5.事件处理程序
         public  void  HostHandleEvent(Object sender, AlarmEventArgs e)
         {
             Console.WriteLine( "Host caught the thief! The sum is " +e.numberOfThief);
         }
     }
     
     class  Program
     {
         static  void  Main( string [] args)
         {
             
             Console.WriteLine( "Program is running..." );
 
             Dog dog =  new  Dog();
             Host host =  new  Host(dog);
 
             Console.WriteLine( "Someone is coming..." );
             //6.在合适的时候引发事件
             AlarmEventArgs alarmEventArgs =  new  AlarmEventArgs(3);
             dog.OnAlarm(alarmEventArgs);
 
             Console.ReadKey();
         }
     }
}

 

程序运行结果如下:

例子很简单,我是按照顺序写的,在代码中也有详细的步骤注释,就不多讲了。一般经验来讲,自定义的东西往往是很有用的,而往往也不是人人能够掌 握,DebugLZQ总结了一下,也没有什么高端的技术,遇到了自定义事件的这个事情,写下来吧,心里也就不虚了~具体流程可能一千个人一千个哈姆雷特, 看个人习惯~

本文自定义的CLR事件,关于自定义WPF的路由事件请参考:WPF 自定义路由事件

接下来英语口语要注意锻炼,技术要继续学习(重点是加强LINQ,WCF,WPF以及敏捷开发方面的知识),努力提高自己的专业素质,在此期间完成毕业论文。

时间又是很晚了~手指在键盘上流浪至天明吧~多么美丽的夜晚---So Beautiful ! 

=====================================================

 

Update:

我们可以使用.NET提供的EventHandler<TEventArgs> delegate来简化,事件的定义及使用,提高开发效率和代码质量~

如下(区别在步骤2和4,省略了1):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using  System;
 
namespace  RefactorCustomizeEventDemo
{
     //http://www.cnblogs.com/DebugLZQ
     //自定义事件步骤的示例代码
 
     //0.定义事件传递的参数
     class  AlarmEventArgs : EventArgs
     {
         public  int  numberOfThief;
         public  AlarmEventArgs( int  n)
         {
             numberOfThief = n;
         }
     }
     //事件的发出者
     class  Dog
     {
 
         //2.声明事件
         public  event  EventHandler<AlarmEventArgs> Alarm;
         //3.引发事件的函数
         public  void  OnAlarm(AlarmEventArgs e)
         {
             if  (Alarm !=  null )
             {
                 Console.WriteLine( "The dog is Wangwang..." );
                 Alarm( this , e);
             }
         }
     }
     //事件的订阅者
     class  Host
     {
         //4.订阅事件
         public  Host(Dog dog)
         {
             // dog.Alarm += new EventHandler<AlarmEventArgs>(HostHandleEvent); // this line is equal to the next line
             dog.Alarm += HostHandleEvent;
         }
         //5.事件处理程序
         public  void  HostHandleEvent(Object sender, AlarmEventArgs e)
         {
             Console.WriteLine( "Host caught the thief! The sum is "  + e.numberOfThief);
         }
     }
 
     class  Program
     {
         static  void  Main( string [] args)
         {
 
             Console.WriteLine( "Program is running..." );
 
             Dog dog =  new  Dog();
             Host host =  new  Host(dog);
 
             Console.WriteLine( "Someone is coming..." );
             //6.在合适的时候引发事件
             AlarmEventArgs alarmEventArgs =  new  AlarmEventArgs(3);
             dog.OnAlarm(alarmEventArgs);
 
             Console.ReadKey();
         }
     }
 
}

 

步骤2:申明事件的最佳实践如下:

//2.声明事件
public event EventHandler<AlarmEventArgs> Alarm= delegate { };

程序运行如下:

 

Update:

请参考DebugLZQ后续博文:

WPF 4.5 New Feature:Using the WeakEvent pattern with WeakEventManager to avoid memory leaking

[C#] A simple implementation of the WeakEvent pattern

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。





    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5844498.html,如需转载请自行联系原作者



相关文章
|
1月前
|
JavaScript
在Vue中,如何使用事件总线来传递数据和触发事件?
在Vue中,如何使用事件总线来传递数据和触发事件?
14 0
|
6月前
|
JavaScript
62Vue - 自定义事件(使用自定义事件的表单输入组件)
62Vue - 自定义事件(使用自定义事件的表单输入组件)
23 0
|
4月前
|
前端开发 JavaScript UED
Vue3中的事件处理:事件绑定、事件修饰符、自定义事件
Vue3中的事件处理:事件绑定、事件修饰符、自定义事件
98 0
|
6月前
|
JavaScript API
61Vue - 自定义事件(使用 v-on 绑定自定义事件)
61Vue - 自定义事件(使用 v-on 绑定自定义事件)
22 0
|
6月前
|
JavaScript 前端开发
36Vue - 事件处理器(监听事件)
36Vue - 事件处理器(监听事件)
14 0
|
6月前
|
JavaScript 前端开发
37Vue - 事件处理器(方法事件处理器)
37Vue - 事件处理器(方法事件处理器)
17 0
|
8月前
|
JavaScript
Vue学习之参数传递与事件分发使用this.$emit(‘自定义事件名‘, 参数)自定义事件删除待办事项
数据项在 Vue 的实例中,但删除操作要在组件中完成,那么组件如何才能删除 Vue 实例中的数据呢? 此时就涉及到参数传递与事件分发了,Vue 为我们提供了自定义事件的功能很好的帮助我们解决了这个问题;使用this.$emit(‘自定义事件名’, 参数),操作过程如下
125 0
|
8月前
|
JavaScript
|
8月前
|
JavaScript
[Vue]组件自定义事件(二)
[Vue]组件自定义事件(二)
|
XML 缓存 NoSQL
事件监听思考
在整合在项目中,我们通常需要基于事件去触发另外的业务逻辑动作的完成。也即在我们做需求时,通常会基于不同的事件码来完成业务处理,此时可以考虑将其单独处理,基于观察者模式+策略模式。还有一种如果当Spring完成Bean的初始化,需要做一些特殊处理,此时除了使用InitializingBean,还可以使用监听完成一些定制化的初始化动作,实现ApplicationListener<ContextRefreshedEvent>。
103 0
事件监听思考