委托 事件 实例代码演示
/*
* By:.NET 钉子户
* Date: 2009-2-16
* Time: 10:47
*/
using System;
//定义一个提供事件数据的类 ,以EventNameEventArgs格式进行命名
class PubEventArgs : EventArgs
{
private readonly string _magazineName;
private readonly DateTime _pubDateTime;
public PubEventArgs(string magazineName,DateTime pubDateTime)
{
_magazineName=magazineName;
_pubDateTime=pubDateTime;
}
public string MagzineName
{
get{return _magazineName;}
}
public DateTime PubDateTime
{
get{ return _pubDateTime;}
}
}
class Publisher
{
public delegate void PubCompanyEventHandle(object sender,PubEventArgs e);
public delegate void PubLifeEventHandle(object sender,PubEventArgs e);
public event PubCompanyEventHandle PubCompany;
public event PubLifeEventHandle PubLife;
protected virtual void OnPubCompany(PubEventArgs e)
{
PubCompanyEventHandle handle=PubCompany;//为什么要声明一个临时事件变量呢?这样做主要是为了防止线程同步问题
if(handle!=null)
{
handle(this,e);
}
}
protected virtual void OnPubLife(PubEventArgs e)
{
PubLifeEventHandle handle=PubLife;
if(handle!=null)
{
handle(this,e);
}
}
public void IssueCompany(string magazineName,DateTime pubDateTime)//注意些处的参数,不用与委托签名一致
{
Console.WriteLine("发行"+magazineName);
OnPubCompany(new PubEventArgs(magazineName,pubDateTime));//调用用OnPubCompany方法
}
public void IssueLife(string magazineName,DateTime pubDateTime)//注意些处的参数,不用与委托签名一致
{
Console.WriteLine("发行"+magazineName);
OnPubLife(new PubEventArgs(magazineName,pubDateTime));//调用用OnPubCompany方法
}
}
class Subscribe
{
private string _name;
public Subscribe (string name)
{
_name=name;
}
public void Receive(object sender,PubEventArgs e)
{
Console.WriteLine(e.PubDateTime+_name+"已经收到"+e.MagzineName);
}
}
class story
{
static void Main()
{
Publisher pub=new Publisher();
Subscribe zs=new Subscribe("张三");
Subscribe ls=new Subscribe("李四");
pub.PubCompany +=new Publisher.PubCompanyEventHandle(zs.Receive);
pub.PubCompany += new Publisher.PubCompanyEventHandle(ls.Receive);
pub.PubLife += new Publisher.PubLifeEventHandle(ls.Receive);
pub.IssueCompany("电脑杂志",Convert.ToDateTime("2009-02-16"));
pub.IssueLife("生活杂志", Convert.ToDateTime("2009-02-16"));
Console.WriteLine();
Console.WriteLine("一年之后");
pub.PubCompany -= new Publisher.PubCompanyEventHandle(ls.Receive);
pub.IssueCompany("电脑杂志",Convert.ToDateTime("2010-02-16"));
pub.IssueLife("生活杂志",Convert.ToDateTime("2010-02-16"));
}
}

浙公网安备 33010602011771号