在c#里面委托就像函数指针,在程序运行时,可以用委托调用不同的方法。
委托是一种方法的引用类型,一旦委托分配了方法,委托将与该方法具有相同的行为。
事件则是委托的一种特殊形式,当事件发生有意义的事情时,事件对象处理通知过程。
下面用老板和助理的例子介绍一下
Case1:公司老板每隔一段时间需要去海外出差,和国外的公司恰然合作事宜,出差前,老板会通知他的助理安排一下他给的列表里面的每件事情,譬如说:中秋快来了,需要人事派发中秋福利;需要开发负责人汇报每个礼拜的开发工作.....这些事可以由老板亲自完成,但是老板是大忙人啊,所以就委托他的助理带他完成这些事。这个就和c#里面的委托结合起来了,下面看一下代码
首先是助理类 Assist
public class Assist
{
public void SendMessage(List<string> _listConetnt)
{
for (int i = 0; i < _listConetnt.Count; i++)
{
Console.WriteLine(_listConetnt[i]);
}
}
}
助理就一个职责 帮老板任务列表里面的消息一一传达
老板类 (Boss)
public class Boss
{
private delegate void messgaeDelegate(List<string> _listContent);
private List<string> _content = new List<string> { "Task1","Task2","Task3"};
public void SendMessage()
{
messgaeDelegate _delegate = new messgaeDelegate(new Assist().SendMessage);
_delegate(_content);
}
}
老板有一个委托对象和一个任务列表,老板想员工派发任务的时候其实是让他的助理完成的,委托了助理的SendMessage方法。
客户端的调用
class Program
{
static void Main(string[] args)
{
Boss _boss = new Boss();
_boss.SendMessage();
}
}
Case 2:
在老板出差的过程中,老板想起了一些事还没交代,是在任务列表外的,只能通过邮件的形式告诉Boss了,邮件就是一个事件的载体,他帮老板传达了要让助理做的事情
下面看一下代码 比起上面一段代码来 多了一个Mail类
namespace BossAndAssistDemo
{
public class Boss
{
public delegate void MessgaeDelegateByMail(Mail _mail);
public event MessgaeDelegateByMail MessageEventByMail;
public void SendMessageByMail()
{
Mail _mail = new Mail();
_mail.Sender = "Boss";
_mail.Content = "Task008";
MessageEventByMail(_mail);
}
}
}
namespace BossAndAssistDemo
{
public class Assist
{
public Assist(Boss _boss)
{
_boss.MessageEventByMail += new Boss.MessgaeDelegateByMail(SendMessageByMail);
}
public void SendMessageByMail(Mail _mail)
{
if (_mail.Sender.Equals("Boss"))
{
Console.WriteLine(_mail.Content);
}
else
{
Console.WriteLine("不是老板发来的邮件");
}
}
}
}
namespace BossAndAssistDemo
{
public class Mail:EventArgs
{
private string sender;
public string Sender
{
get { return sender; }
set { sender = value; }
}
private string content;
public string Content
{
get { return content; }
set { content = value; }
}
}
}
namespace BossAndAssistDemo
{
class Program
{
static void Main(string[] args)
{
Boss _boss = new Boss();
Assist _assist = new Assist(_boss);
_boss.SendMessageByMail();
}
}
}