第一次接触事件这个概念,对于我来讲,还是挺难理解的。
最后,想通了,就是事件就相当于一个委托对象。
以下例子,实现同样的效果,分别用事件与委托对象的代码。
你会觉得还是事件好点。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication1
{
public delegate void MySayDelegate();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 定义事件,触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//事件发出者
银行 y = new 银行();
//事件接收者
小偷 x = new 小偷();
警察 j1 = new 警察();
警察 j2 = new 警察();
//定义事件
y.警铃事件 += x.跑;
y.警铃事件 += j1.追;
y.警铃事件 += j2.追;
//触发事件
y.警铃响();
}
/// <summary>
/// 用委托实现,与触发事件一样的功能
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
银行2 y = new 银行2();
小偷 x = new 小偷();
警察 j1 = new 警察();
警察 j2 = new 警察();
y.mydelegate += x.跑;
y.mydelegate += j1.追;
y.mydelegate += j2.追;
y.警铃响();
}
}
public class 小偷
{
public void 跑()
{
MessageBox.Show("警铃响,我是小偷,我跑跑跑!");
}
}
public class 警察
{
public void 追()
{
MessageBox.Show("警铃响,我是阿Sir,有小偷,我追追追!");
}
}
/// <summary>
/// 用事件,实现多播委托,代码简单
/// </summary>
public class 银行
{
//定义委托类型,就是要执行的方法类型
public delegate void ActDelegate();
//事件可以看成一个委托对象
public event ActDelegate 警铃事件;
//警铃响,触发 警铃事件
public void 警铃响()
{
警铃事件();
}
}
/// <summary>
/// 不用事件,只用委托对象,实现多播委托,感觉有点怪怪的。所以才会有事件这个概念出来吧。
/// </summary>
public class 银行2
{
//定义委托类型,就是要执行的方法类型
public delegate void ActDelegate();
//定义委托对象
public ActDelegate mydelegate = new ActDelegate(go);
//委托要执行的方法类型,并不需要写具体执行的代码
public static void go()
{
}
//警铃响,触发委托对象
public void 警铃响()
{
mydelegate();
}
}
}