提到委托就要想到事件。
关于委托
1)委托是一种类型。但是委托定义了方法的类型。
2)这样,把方法做为参数进行传递成为可能。
形式
delegate void GreetingDelegate(string name);
void EnglishGreeting(string name)
void ChineseGreeting(string name)
签名相同的方法就是委托类型的,以上两种方法便是委托类型的。
传参数时只传方法名。如:直接传EnglishGreeting
委托链(作用是批处理):
委托不同于string的一个特性:可以将多个方法捆绑(委托、注册)到同一个委托对象上,形成委托链,当调用这个委托对象的时候,将依次调用委托链中的方法。
事件
关于事件的说法:
1)委托是一种自定义的类型。委托定义了方法的类型。
2)事件是委托的实例。使用委托实例的委托链注册一些方法。使用+=注册,-=撤销
3)当事件发生的时候,调用委托链中的这些方法。不妨称这些方法为事件处理函数。
举例:
热水器发出水开的事件
警报器接受这个事件,做出相应的动作
显示器接受这个事件,做出相应的动作
如果想让报警器和显示器能接受到这个事件,那么方法需要注册这个事件。
关于委托
1)委托是一种类型。但是委托定义了方法的类型。
2)这样,把方法做为参数进行传递成为可能。
形式
delegate void GreetingDelegate(string name);
void EnglishGreeting(string name)
void ChineseGreeting(string name)
签名相同的方法就是委托类型的,以上两种方法便是委托类型的。
传参数时只传方法名。如:直接传EnglishGreeting
委托链(作用是批处理):
委托不同于string的一个特性:可以将多个方法捆绑(委托、注册)到同一个委托对象上,形成委托链,当调用这个委托对象的时候,将依次调用委托链中的方法。
namespace WindowsFormsApplication1
{
public delegate void Greeting(string name);//定义委托,委托是定义方法的类型
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定义两个方法,签名(形式)与委托的签名相同。
private void EnglishGreeting(string name) {
MessageBox.Show("Hello,"+name);
}
private void ChineseGreeting(string name) {
MessageBox.Show("你好,"+name);
}
//使方法成为参数成为可能
private void MakeGreeting(string name, Greeting greeting) {
greeting(name);
}
private void Form1_Load(object sender, EventArgs e)
{
MakeGreeting("Kobe", EnglishGreeting);//调用方法
MakeGreeting("科比", ChineseGreeting);
Greeting delegate1 = new Greeting(EnglishGreeting);//声明委托对象,就把方法EngishGreeting委托给对象delegate1了,也可以说委托对象delegate1代表方法EngishGreeting,以委托对象就可以采用下种用法了。
delegate1("Kobe");
delegate1 = ChineseGreeting;//委托对象的重新赋值
delegate1("科比");
//委托链,实现批处理
delegate1 += EnglishGreeting;
delegate1 += ChineseGreeting;
delegate1("中国");
}
}
}
事件
关于事件的说法:
1)委托是一种自定义的类型。委托定义了方法的类型。
2)事件是委托的实例。使用委托实例的委托链注册一些方法。使用+=注册,-=撤销
3)当事件发生的时候,调用委托链中的这些方法。不妨称这些方法为事件处理函数。
举例:
热水器发出水开的事件
警报器接受这个事件,做出相应的动作
显示器接受这个事件,做出相应的动作
如果想让报警器和显示器能接受到这个事件,那么方法需要注册这个事件。
using Delegate;//引入命名空间
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//声明三个对象
Heater heater=new Heater ();
Alarm alarm=new Alarm ();
Display display=new Display ();
heater .BoilEvent +=alarm .Alert ;//注册方法
heater .BoilEvent +=display .ShowMsg ;
heater .BoilWater ();
}
}
}
namespace Delegate
{
//热水器类
public class Heater
{
private int temperature = 0;
public delegate void BoilHandler(int param);//委托是方法的类型
public event BoilHandler BoilEvent;//事件是委托的实例,把方法委托给实例,实例就代表了方法。
public void BoilWater() {
for (int i = 0; i <=100 ; i++)
{
temperature++;
if (temperature ==99&&BoilEvent !=null)
{
BoilEvent(temperature);//实例代表了方法,所以可以用这种形式
}
}
}
}
//报警器类
public class Alarm
{
public void Alert(int temperature)
{
MessageBox.Show("水开了,温度为"+temperature .ToString ());
}
}
//显示器类
public class Display
{
public void ShowMsg(int temperature)
{
MessageBox.Show("水温现在是:"+temperature .ToString ());
}
}