1.什么是事件,事件和委托什么关系?
事件?事件,就是,比如按一个按钮,弹出你好对话框,就是一个事件。
事件和委托? 事件就是委托的一种呀,委托可以理解为回调机制,回调函数。
2. 怎么理解C#事件,可以用一个例子说明?
C#事件,我们可以举个栗子。
邮件管理者可以接收各种各样的邮件,但邮件管理者不做邮件处理, 比如打印邮件是传真机做的事情。
那么邮件管理者可以接收到邮件后,通知打印机打印该邮件。这个过程就是C#事件处理的过程。
首先我们要清楚几个对象:
(1) 邮件是一个事件动作类型,这个事件上可以是定义什么人发邮件,接收邮件,内容是什么等等。
(2) 邮件管理者,是负责邮件接收的对象,是这个事件的直接关系人,但功能就是接收邮件,不对邮件进行其他处理。
(3) 打印机,打印机负责对 接收邮件后续的操作,他无法接收邮件,只能求邮件管理者告诉他需要的邮件,那么就会产生一个订阅的操作。
3.那么每个对象中需要做的事情是什么?
(1)邮件事件对象 :
a.继承于事件EventArgs,定义该事件的参数。
b. 定义一个邮件事件的委托,负责给邮件管理者用。
(2) 邮件管理者:
a. 定义接收邮件的委托对象,作为触发邮件事件的对象。
b. 有一个触发事件的函数,需要触发该函数,才能接收邮件这个时间。
c. 可以包装一下这个触发事件,满足邮件事件对象的要求。
d. 通知 订阅者(打印机),邮件到了,可以进行打印了。
(3)打印机 事件订阅者
a. 订阅事件,求邮件管理者帮忙通知他一下。
b. 收到通知后,后续处理函数。
4. 理解了以上事件的流程,那么可以粘贴代码了。
4.1 事件对象
/// <summary>
/// 定义事件委托,负责给管理者用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void MailEventHandler(object sender, MailEventArgs e);/// <summary>
/// 事件类 /// </summary> public class MailEventArgs: EventArgs { public string From;public string To;
public string Content;
public MailEventArgs(string from, string to, string content)
{ this.From = from; this.To = to; this.Content = content; } }4.2 事件管理者(邮件管理)
/// <summary>
/// 事件管理者,(邮件管理) /// </summary> public class MailManager { /// <summary> /// 定义接收邮件事件 /// </summary> public event MailEventHandler MailHandler;/// <summary>
/// 触发事件函数 /// </summary> /// <param name="e"></param> public void OnMail(MailEventArgs e) { var handler = this.MailHandler; if(handler != null) { handler(this, e); } }/// <summary>
/// 包装一下触发函数 /// </summary> public void ReceiveMail(string from ,string to, string content) { MailEventArgs e = new MailEventArgs(from, to, content); OnMail(e); } }
4.3 事件的订阅者,打印处理
/// <summary>
/// 事件订阅者,传真打印 /// </summary> public class Fax { /// <summary> /// 事件订阅,管理者通知订阅者进行下一步操作。(传真打印) /// </summary> /// <param name="mm"></param> public Fax(MailManager mm) { mm.MailHandler += FaxMsg; }/// <summary>
/// 订阅者处理事情 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void FaxMsg(object sender, MailEventArgs e) { Console.WriteLine("打印{0},{1},{2}", e.To, e.From, e.Content); } }
4.4 什么时候接收到邮件,通知打印机
static void Main(string[] args)
{ MailManager mm = new MailManager(); mm.ReceiveMail("Bill", "Mike", "nihao");Fax fax = new Fax(mm);
}
搞定。