关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了。
用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了。描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量。下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程。
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