1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.ComponentModel;
6
7
namespace EventSample
8
{
9
//定义事件参数类
10
public class AlarmEventArgs:EventArgs
11
{
12
private readonly bool keepingSleep;
13
private readonly int numrings;
14
15
//构造函数
16
public AlarmEventArgs(bool keepingSleep, int numrings)
17
: base()
18
{
19
this. keepingSleep = keepingSleep;
20
this.numrings = numrings;
21
}
22
23
//定义属性
24
public int NumRings
25
{
26
get { return numrings; }
27
}
28
29
public bool KeepingSleep
30
{
31
get { return keepingSleep; }
32
}
33
34
public string AlarmText
35
{
36
get
37
{
38
if ( keepingSleep)
39
{
40
return ("要迟到了!懒虫快起床!");
41
}
42
else
43
{
44
return ("太阳出来啰,起床吧!");
45
}
46
}
47
}
48
}
49
50
//声明自定义代理类型,它的事件参数的类型为AlarmEventArgs
51
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
52
53
//包含事件和触发事件方法的类
54
public class AlarmClock
55
{
56
private bool keepingSleep=false ;
57
private int numrings=0;
58
private bool stop=false ;
59
60
public bool Stop
61
{
62
get {return stop; }
63
set {stop =value ;}
64
}
65
66
public bool KeepingSleep
67
{
68
get {return keepingSleep; }
69
set { keepingSleep=value ;}
70
}
71
72
//声明事件,它所使用的代理类型为AlarmEventHandler
73
public event AlarmEventHandler Alarm;
74
75
76
//触发事件的方法
77
protected virtual void OnAlarm(AlarmEventArgs e)
78
{
79
if (Alarm !=null )
80
{
81
//通过代理调用事件处理方法
82
Alarm (this ,e );
83
}
84
}
85
86
//在该方法中循环调用OnAlarm方法来触发事件,直到stop字段的值为true
87
public void Start()
88
{
89
for ( ; ; )
90
{
91
numrings++;
92
if (stop)
93
{
94
break;
95
}
96
else if (KeepingSleep)
97
{
98
//程序暂停0.5秒钟
99
System.Threading.Thread.Sleep(500);
100
{
101
//创建事件参数对象实例
102
AlarmEventArgs e = new AlarmEventArgs(KeepingSleep, numrings);
103
OnAlarm(e);
104
//触发事件,在事件处理方法中会相应地设置KeepingSleep和Stop字段的值(通过属性来设置)
105
}
106
}
107
else
108
{
109
//程序暂停0.3秒
110
System.Threading.Thread.Sleep(300);
111
AlarmEventArgs e = new AlarmEventArgs(keepingSleep, numrings);
112
OnAlarm(e);//触发事件
113
}
114
}
115
}
116
}
117
118
//包含事件处理方法的类
119
public class WakeMeUp
120
{
121
//事件处理方法,在该方法中根据用户的输入来通过事件参数sender设置事件发送者属性
122
public void AlarmRing(object sender, AlarmEventArgs e)
123
{
124
Console.WriteLine(e.AlarmText + "\n");
125
126
if (!(e.KeepingSleep))
127
{
128
if (e.NumRings % 10 == 0)
129
{
130
Console.WriteLine("继续叫你起床!(请输入Y)");
131
Console.WriteLine("让你再睡一会儿!(请输入N)");
132
Console.WriteLine("停止闹铃!(请输入不同于Y和N的键)");
133
string input = Console.ReadLine();
134
135
if (input.Equals("Y") || input.Equals("y")) return;
136
else if (input.Equals("N") || input.Equals("n"))
137
{
138
//通过事件参数sender来访问触发事件的对象
139
((AlarmClock)sender).KeepingSleep = true;
140
return;
141
}
142
else
143
{
144
((AlarmClock)sender).Stop = true;
145
return;
146
}
147
}
148
}
149
else
150
{
151
Console.WriteLine("继续叫你起床!(请输入Y)");
152
string input = Console.ReadLine();
153
if (input.Equals("Y") || input.Equals("y")) return;
154
else
155
{
156
((AlarmClock)sender).Stop = true;
157
return;
158
}
159
}
160
}
161
}
162
163
//包含程序入口方法的类
164
public class AlarmDriver
165
{
166
public static void Main(string[] args)
167
{
168
//创建事件接收者对象实例
169
WakeMeUp waking = new WakeMeUp();
170
171
//创建事件发送者对象实例
172
AlarmClock clock = new AlarmClock();
173
174
//把事件处理方法绑定到发送者的事件上
175
clock.Alarm += new AlarmEventHandler(waking.AlarmRing);
176
177
clock.Start();
178
}
179
}
180
}
181
182
运行结果:
using System;2
using System.Collections.Generic;3
using System.Linq;4
using System.Text;5
using System.ComponentModel;6

7
namespace EventSample8
{9
//定义事件参数类10
public class AlarmEventArgs:EventArgs 11
{12
private readonly bool keepingSleep;13
private readonly int numrings;14

15
//构造函数16
public AlarmEventArgs(bool keepingSleep, int numrings)17
: base()18
{19
this. keepingSleep = keepingSleep;20
this.numrings = numrings;21
}22

23
//定义属性24
public int NumRings25
{26
get { return numrings; }27
}28

29
public bool KeepingSleep30
{31
get { return keepingSleep; }32
}33

34
public string AlarmText35
{36
get37
{38
if ( keepingSleep)39
{40
return ("要迟到了!懒虫快起床!");41
}42
else43
{44
return ("太阳出来啰,起床吧!");45
}46
}47
}48
}49

50
//声明自定义代理类型,它的事件参数的类型为AlarmEventArgs51
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);52

53
//包含事件和触发事件方法的类54
public class AlarmClock55
{56
private bool keepingSleep=false ;57
private int numrings=0;58
private bool stop=false ;59

60
public bool Stop61
{62
get {return stop; }63
set {stop =value ;}64
}65

66
public bool KeepingSleep67
{68
get {return keepingSleep; }69
set { keepingSleep=value ;}70
}71

72
//声明事件,它所使用的代理类型为AlarmEventHandler73
public event AlarmEventHandler Alarm;74

75

76
//触发事件的方法77
protected virtual void OnAlarm(AlarmEventArgs e)78
{79
if (Alarm !=null )80
{81
//通过代理调用事件处理方法82
Alarm (this ,e );83
}84
}85

86
//在该方法中循环调用OnAlarm方法来触发事件,直到stop字段的值为true87
public void Start()88
{89
for ( ; ; )90
{91
numrings++;92
if (stop)93
{94
break;95
}96
else if (KeepingSleep)97
{98
//程序暂停0.5秒钟99
System.Threading.Thread.Sleep(500);100
{101
//创建事件参数对象实例102
AlarmEventArgs e = new AlarmEventArgs(KeepingSleep, numrings);103
OnAlarm(e);104
//触发事件,在事件处理方法中会相应地设置KeepingSleep和Stop字段的值(通过属性来设置)105
}106
}107
else108
{109
//程序暂停0.3秒110
System.Threading.Thread.Sleep(300);111
AlarmEventArgs e = new AlarmEventArgs(keepingSleep, numrings);112
OnAlarm(e);//触发事件113
}114
}115
}116
}117

118
//包含事件处理方法的类119
public class WakeMeUp120
{121
//事件处理方法,在该方法中根据用户的输入来通过事件参数sender设置事件发送者属性122
public void AlarmRing(object sender, AlarmEventArgs e)123
{124
Console.WriteLine(e.AlarmText + "\n");125

126
if (!(e.KeepingSleep))127
{128
if (e.NumRings % 10 == 0)129
{130
Console.WriteLine("继续叫你起床!(请输入Y)");131
Console.WriteLine("让你再睡一会儿!(请输入N)");132
Console.WriteLine("停止闹铃!(请输入不同于Y和N的键)");133
string input = Console.ReadLine();134

135
if (input.Equals("Y") || input.Equals("y")) return;136
else if (input.Equals("N") || input.Equals("n"))137
{138
//通过事件参数sender来访问触发事件的对象139
((AlarmClock)sender).KeepingSleep = true;140
return;141
}142
else143
{144
((AlarmClock)sender).Stop = true;145
return;146
}147
}148
}149
else150
{151
Console.WriteLine("继续叫你起床!(请输入Y)");152
string input = Console.ReadLine();153
if (input.Equals("Y") || input.Equals("y")) return;154
else155
{156
((AlarmClock)sender).Stop = true;157
return;158
}159
}160
}161
}162

163
//包含程序入口方法的类164
public class AlarmDriver165
{166
public static void Main(string[] args)167
{168
//创建事件接收者对象实例169
WakeMeUp waking = new WakeMeUp();170

171
//创建事件发送者对象实例172
AlarmClock clock = new AlarmClock();173

174
//把事件处理方法绑定到发送者的事件上175
clock.Alarm += new AlarmEventHandler(waking.AlarmRing);176

177
clock.Start();178
}179
}180
}181

182




posted on
浙公网安备 33010602011771号