十三、C# 事件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了十三、C# 事件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含13229字,纯文字阅读大概需要19分钟。
内容图文
1
class
Program
2
{
3
static
void Main(string[] args)
4 {
5//连接发布者和订阅者 6 Thermostat tm = new Thermostat();
7 Cooler cl = new Cooler(40);
8 Heater ht = new Heater(60);
9//设置委托变量关联的方法。+=可以存储多个方法,这些方法称为订阅者。 10 tm.OnTemperatureChange += cl.OnTemperatureChanged;
11 tm.OnTemperatureChange += ht.OnTemperatureChanged;
12string temperature = Console.ReadLine();
13 14//将数据发布给订阅者(本质是依次运行那些方法) 15 tm.OnTemperatureChange(float.Parse(temperature));
16 17 Console.ReadLine();
18 19 20 21 }
22 }
23//两个订阅者类 24class Cooler
25 {
26public Cooler(float temperature)
27 {
28 _Temperature = temperature;
29 }
30privatefloat _Temperature;
31publicfloat Temperature
32 {
33set 34 {
35 _Temperature = value;
36 }
37get 38 {
39return _Temperature;
40 }
41 }
42 43//将来会用作委托变量使用,也称为订阅者方法 44publicvoid OnTemperatureChanged(float newTemperature)
45 {
46if (newTemperature > _Temperature)
47 {
48 Console.WriteLine("Cooler:on ! ");
49 }
50else 51 {
52 Console.WriteLine("Cooler:off ! ");
53 }
54 }
55 }
56class Heater
57 {
58public Heater(float temperature)
59 {
60 _Temperature = temperature;
61 }
62privatefloat _Temperature;
63publicfloat Temperature
64 {
65set 66 {
67 _Temperature = value;
68 }
69get 70 {
71return _Temperature;
72 }
73 }
74publicvoid OnTemperatureChanged(float newTemperature)
75 {
76if (newTemperature < _Temperature)
77 {
78 Console.WriteLine("Heater:on ! ");
79 }
80else 81 {
82 Console.WriteLine("Heater:off ! ");
83 }
84 }
85 }
86 87 88//发布者 89class Thermostat
90 {
91 92//定义一个委托类型 93publicdelegatevoid TemperatureChangeHanlder(float newTemperature);
94//定义一个委托类型变量,用来存储订阅者列表。注:只需一个委托字段就可以存储所有订阅者。 95private TemperatureChangeHanlder _OnTemperatureChange;
96//现在的温度 97privatefloat _CurrentTemperature;
98 99public TemperatureChangeHanlder OnTemperatureChange
100 {
101set { _OnTemperatureChange = value; }
102get { return _OnTemperatureChange; }
103 }
104105106publicfloat CurrentTemperature
107 {
108get { return _CurrentTemperature;}
109set110 {
111if (value != _CurrentTemperature)
112 {
113 _CurrentTemperature = value;
114 }
115 }
116 }
117 }
public
float
CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
OnTemperatureChange(value);
}
}
}
public
float
CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
TemperatureChangeHanlder localOnChange = OnTemperatureChange;
if (localOnChange != null)
{
//OnTemperatureChange = null; localOnChange(value);
}
}
}
}
1
Thermostat.TemperatureChangeHanlder delegate1;
2
Thermostat.TemperatureChangeHanlder delegate2;
3
Thermostat.TemperatureChangeHanlder delegate3;
4 delegate3 = tm.OnTemperatureChange;
5 delegate1 = cl.OnTemperatureChanged;
6 delegate2 = ht.OnTemperatureChanged;
7 delegate3 += delegate1;
8 delegate3 += delegate2;
1
Thermostat.TemperatureChangeHanlder delegate1;
2
Thermostat.TemperatureChangeHanlder delegate2;
3
Thermostat.TemperatureChangeHanlder delegate3;
4 delegate1 = cl.OnTemperatureChanged;
5 delegate2 = ht.OnTemperatureChanged;
6 delegate3 = delegate1 + delegate2;
7 delegate3 = delegate3 - delegate2;
8 tm.OnTemperatureChange = delegate3;
1
public
float
CurrentTemperature
2
{
3
get { return _CurrentTemperature; }
4set 5 {
6if (value != _CurrentTemperature)
7 {
8 9 _CurrentTemperature = value;
10 TemperatureChangeHanlder localOnChange = OnTemperatureChange;
11if (localOnChange != null)
12 {
13foreach (TemperatureChangeHanlder hanlder in localOnChange.GetInvocationList())
14 {
15try16 {
17 hanlder(value);
18 }
19catch (Exception e)
20 {
21 Console.WriteLine(e.Message);
2223 }
24 }
25 }
2627 }
28 }
29 }
1
public
class
Thermostat
2
{
3
private
float
_CurrentTemperature;
4
public
float
CurrentTemperature
5
{
6
set { _CurrentTemperature = value; }
7get { return _CurrentTemperature; }
8 }
9//定义委托类型10publicdelegatevoid TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
1112//定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。13publicevent TemperatureChangeHandler OnTemperatureChange = delegate { };
141516publicclass TemperatureArgs : System.EventArgs
17 {
18privatefloat _newTemperature;
19publicfloat NewTemperature
20 {
21set { _newTemperature = value; }
22get { return _newTemperature; }
23 }
24public TemperatureArgs(float newTemperature)
25 {
26 _newTemperature = newTemperature;
27 }
2829 }
30 }
1
class
Program
2
{
3
static
void Main(string[] args)
4 {
5 Thermostat tm = new Thermostat();
6 7 Cooler cl = new Cooler(40);
8 Heater ht = new Heater(60);
9 10//设置订阅者(方法) 11 tm.OnTemperatureChange += cl.OnTemperatureChanged;
12 tm.OnTemperatureChange += ht.OnTemperatureChanged;
13 14 tm.CurrentTemperature = 100;
15 }
16 }
17//发布者类 18publicclass Thermostat
19 {
20privatefloat _CurrentTemperature;
21publicfloat CurrentTemperature
22 {
23set 24 {
25if (value != _CurrentTemperature)
26 {
27 _CurrentTemperature = value;
28if (OnTemperatureChange != null)
29 {
30 OnTemperatureChange(this, new TemperatureArgs(value));
31 }
32 33 }
34 }
35get { return _CurrentTemperature; }
36 }
37//定义委托类型 38publicdelegatevoid TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
39 40//定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。 41publicevent TemperatureChangeHandler OnTemperatureChange = delegate { };
42 43//用来给事件传递的数据类型 44publicclass TemperatureArgs : System.EventArgs
45 {
46privatefloat _newTemperature;
47publicfloat NewTemperature
48 {
49set { _newTemperature = value; }
50get { return _newTemperature; }
51 }
52public TemperatureArgs(float newTemperature)
53 {
54 _newTemperature = newTemperature;
55 }
56 57 }
58 }
59 60//两个订阅者类 61class Cooler
62 {
63public Cooler(float temperature)
64 {
65 _Temperature = temperature;
66 }
67privatefloat _Temperature;
68publicfloat Temperature
69 {
70set 71 {
72 _Temperature = value;
73 }
74get 75 {
76return _Temperature;
77 }
78 }
79 80//将来会用作委托变量使用,也称为订阅者方法 81publicvoid OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
82 {
83if (newTemperature.NewTemperature > _Temperature)
84 {
85 Console.WriteLine("Cooler:on ! ");
86 }
87else 88 {
89 Console.WriteLine("Cooler:off ! ");
90 }
91 }
92 }
93class Heater
94 {
95public Heater(float temperature)
96 {
97 _Temperature = temperature;
98 }
99privatefloat _Temperature;
100publicfloat Temperature
101 {
102set103 {
104 _Temperature = value;
105 }
106get107 {
108return _Temperature;
109 }
110 }
111publicvoid OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
112 {
113if (newTemperature.NewTemperature < _Temperature)
114 {
115 Console.WriteLine("Heater:on ! ");
116 }
117else118 {
119 Console.WriteLine("Heater:off ! ");
120 }
121 }
122 }
1
//
定义委托类型
2
public
delegate
void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
3 4//定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。 5publicevent TemperatureChangeHandler OnTemperatureChange = delegate { };
6 7在编译器的作用下,会自动扩展成:
8private TemperatureChangeHandler _OnTemperatureChange = delegate { };
910publicvoid add_OnTemperatureChange(TemperatureChangeHandler handler)
11 {
12 Delegate.Combine(_OnTemperatureChange, handler);
13 }
14publicvoid remove_OnTemperatureChange(TemperatureChangeHandler handler)
15 {
16 Delegate.Remove(_OnTemperatureChange, handler);
17 }
18publicevent TemperatureChangeHandler OnTemperatureChange
19 {
20 add
21 {
22 add_OnTemperatureChange(value);
23 }
2425 remove
26 {
27 remove_OnTemperatureChange(value);
28 }
2930 }
1
protected TemperatureChangeHandler _OnTemperatureChange = delegate { };
2 3publicevent TemperatureChangeHandler OnTemperatureChange
4 {
5 add
6 {
7//此处代码可以自定义 8 Delegate.Combine(_OnTemperatureChange, value);
910 }
1112 remove
13 {
14//此处代码可以自定义15 Delegate.Remove(_OnTemperatureChange, value);
16 }
1718 }
原文:http://www.cnblogs.com/tlxxm/p/4663160.html
内容总结
以上是互联网集市为您收集整理的十三、C# 事件全部内容,希望文章能够帮你解决十三、C# 事件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。