一段很實用的C#事件委託代碼
1
using System;
2
3
namespace TestConsole
4
{
5
class Program
6
{
7
static void Main(string[] args)
8
{
9
MyText myText = new MyText();
10
myText.Changed += new MyText.ChangedEventHandler(myText_Changed);//訂閱事件
11
12
string str = "";
13
while (str != "quit")
14
{
15
Console.WriteLine("please enter a string:");
16
str = Console.ReadLine();
17
myText.Text = str;//
18
}
19
}
20
//定義事件處理程式
21
private static void myText_Changed(object sender, TestChangeEnventArgs e)
22
{
23
//Console.WriteLine("text has been changed:{0}\n",((MyText)sender).Text);
24
Console.WriteLine("text has been changed:{0}\n",e.Test);
25
}
26
}
27
28
public class TestChangeEnventArgs : EventArgs
29
{
30
public TestChangeEnventArgs(string v)
31
{
32
t = v;
33
}
34
35
private string t = "";
36
37
public string Test
38
{
39
get
40
{
41
return t;
42
}
43
}
44
}
45
46
public class MyText
47
{
48
private string _text = "";
49
//聲明一個委託
50
public delegate void ChangedEventHandler(object sender,TestChangeEnventArgs e);
51
//聲明一個事件
52
public event ChangedEventHandler Changed;
53
//引發一個事件
54
protected virtual void OnChanged(TestChangeEnventArgs e)
55
{
56
if (this.Changed != null)
57
{
58
this.Changed(this, e);
59
}
60
}
61
62
public string Text
63
{
64
// get
65
// {
66
// return this._text;
67
// }
68
set
69
{
70
this._text = value;
71
this.OnChanged(new TestChangeEnventArgs(value));//這個事件是由_text變化引起.
72
}
73
}
74
}
75
76
}
77
78
using System;2

3
namespace TestConsole4
{5
class Program6
{ 7
static void Main(string[] args)8
{ 9
MyText myText = new MyText();10
myText.Changed += new MyText.ChangedEventHandler(myText_Changed);//訂閱事件 11
12
string str = "";13
while (str != "quit")14
{15
Console.WriteLine("please enter a string:");16
str = Console.ReadLine();17
myText.Text = str;//18
}19
}20
//定義事件處理程式21
private static void myText_Changed(object sender, TestChangeEnventArgs e)22
{23
//Console.WriteLine("text has been changed:{0}\n",((MyText)sender).Text);24
Console.WriteLine("text has been changed:{0}\n",e.Test);25
} 26
} 27

28
public class TestChangeEnventArgs : EventArgs29
{30
public TestChangeEnventArgs(string v)31
{32
t = v;33
}34

35
private string t = "";36

37
public string Test38
{39
get40
{41
return t;42
}43
}44
}45

46
public class MyText47
{48
private string _text = "";49
//聲明一個委託50
public delegate void ChangedEventHandler(object sender,TestChangeEnventArgs e);51
//聲明一個事件52
public event ChangedEventHandler Changed;53
//引發一個事件54
protected virtual void OnChanged(TestChangeEnventArgs e)55
{56
if (this.Changed != null)57
{58
this.Changed(this, e);59
}60
}61

62
public string Text63
{64
// get 65
// { 66
// return this._text; 67
// }68
set69
{70
this._text = value;71
this.OnChanged(new TestChangeEnventArgs(value));//這個事件是由_text變化引起.72
}73
}74
}75

76
}77

78

总结一下:其实委托与事件很简单,这样理解:委托是C#的一个类型,它是对方法的的代理,一旦声明委托你就认为这个方法已经有了,至于详细怎样要等与实际方法订阅后才知道。所以委托要声明返回值、参数的个数与类型,以便于订阅的方法符合此委托的类型、返回值与参数的个数。
关于事件就很简单了,一个控件如button,我们按这个按钮就是一个事件,很直观。所以在Button类中定义一个点击事件就行了,但是点击事件后的后续动作当然要方法来实现,但是方法有不能描述很详细的事情,于是就和委托挂钩了。因为只有委托才可以帮事件订阅方法,成为事件与实现方法的纽带。
至于面向对象设计模式中的观察者模式,委托就能很好的解决他,只是这个委托的订阅要放在你设计对象的外面而已,等到你建立好你的对象然后把此对象传入我的观察者对象然后就可以观察那个对象在干什么了。 实例请参考:http://www.blogjava.net/hongzionline/archive/2007/09/14/145056.html


浙公网安备 33010602011771号