大家都熟悉的一段代码,Button1.Click是事件(也可以说是一条委托链),EventHandler是委托,Button1_Click是订阅事件的人,也可以说是委托的人。
通过这样的机制,一个事件可以有多个订阅者,从而可以实现点击button可以响应多个方法。
委托,顾名思义,委托给别人。
事件,“发布者/订阅者” 模式,发布者发布一个事件,订阅者订阅这个事件,当事件触发时,就会通知订阅者。通知这个过程是通过委托来实现的。
大家想象一下这个情景,经理有一个项目,计划A君负责美工方面, B君负责程序方面,将项目一分为二;于是一天,在用餐的时候告诉他们这个计划。
发布者:经理 ---------@2
订阅者订阅这个事件原因: A,B君是经理的部下 -------------@3
事件:经理分配了A,B一个项目-------------@4
触发事件的原因:经理有个计划 ----------------@5
通知方式(委托):”在用餐的时候告诉“方式 ----------------@6
public delegate void OneThing(object sender, CustomEventArgs e);定义一个委托,返回值为空,委托名OneThing,相当于@1中的EventHandler,有两个参数分别为触发事件的对象和事件信息。
CustomEventArgs必须继承于EventArgs
public class CustomEventArgs : EventArgs
{
public CustomEventArgs() //构造函数
{ }
}
声明事件public event OneThing DoThing;
那么要要定义一个触发事件的原因:假设当输入文本为“你们两个把这件事做完”(@5)就触发事件。
定义一个Text属性
{
get
{
return _text;
}
set
{
_text = value;
if (_text == " 你们两个把这件事做完 " )
this .DoThing( this , new CustomEventArgs());
else
Console.WriteLine( " 你没有触发事件 " );
}
}
一旦触发事件就要通过委托机制来告诉订阅者
DelegateExample de = new DelegateExample(); //DelegateExample 一个类,详见源代码
de.DoThing +=new DelegateExample.OneThing(de.DoHalfThing);
de.DoThing += new DelegateExample.OneThing(de.DoOtherHalfThing);
当DoThing被触发时,就会委托给DohalfThing 和 DoOtherHalfThing两个函数。
为这两个被委托的方法书写函数体
{
Console.WriteLine( " 好的,我只做一半,另一半给别人做吧 " );
}
public void DoOtherHalfThing( object sender, DelegateExample.CustomEventArgs e)
{
Console.WriteLine( " 好的,另一半就交给我好了 " );
}
注意其中的参数要和声明委托时相同
总的一个过程是,
输入“你们两个把这件事做完”,
触发事件DoThing
由于DoThing注册了事件处理事件(委托给)两个函数。所以执行了两个函数。
所有代码
{
string _text;
public delegate void OneThing( object sender, CustomEventArgs e);
public event OneThing DoThing;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
if (_text == " 你们两个把这件事做完 " )
this .DoThing( this , new CustomEventArgs());
else
Console.WriteLine( " 你没有触发事件 " );
}
}
public class CustomEventArgs : EventArgs
{
public CustomEventArgs()
{ }
}
public void DoHalfThing( object sender, CustomEventArgs e)
{
Console.WriteLine( " 好的,我只做一半,另一半给别人做吧 " );
}
public void DoOtherHalfThing( object sender,CustomEventArgs e)
{
Console.WriteLine( " 好的,另一半就交给我好了 " );
}
}
{
#region 委托与事件
DelegateExample de = new DelegateExample();
de.DoThing += new DelegateExample.OneThing(de.DoHalfThing);
de.DoThing += new DelegateExample.OneThing(de.DoOtherHalfThing);
string input = Console.ReadLine();
de.Text = input;
Console.ReadLine();
#endregion
}