新手求助(关于事件)
class PubEventArgs : EventArgs
{
private readonly string m_magazineName;
private readonly DateTime m_pubDate;
public PubEventArgs(string magazineName, DateTime pubDate)
{
m_magazineName = magazineName;
m_pubDate = pubDate;
}
public string MagazineName
{
get { return m_magazineName; }
}
public DateTime PubDate
{
get { return m_pubDate; }
}
}
class Publisher //出版者
{
public delegate void PubComputerEventHandler(object sender,PubEventArgs e);//声明事件所需的代理
public delegate void PubLifeEventHandler(object sender, PubEventArgs e);
public event PubComputerEventHandler PubComputer;//事件的声明
public event PubLifeEventHandler PubLife;
protected virtual void OnPubComputer(PubEventArgs e)
{
PubComputerEventHandler handler = PubComputer; //疑问1.
if (handler != null)
{
handler(this,e);//疑问2 }
}
protected virtual void OnPubLife(PubEventArgs e)
{
PubLifeEventHandler handler = PubLife;
if (handler != null)
{
handler(this, e);
}
}
public void issueComputer(string magazinName,DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行"+magazinName);
OnPubComputer(new PubEventArgs(magazinName, pubDate));
}
public void issueLife(string magazinName, DateTime pubDate)
{
Console.WriteLine("发行" + magazinName);
OnPubLife(new PubEventArgs(magazinName, pubDate));
}
}
class Subscriber //订阅者
{
private string name;
public Subscriber(string name)
{
this.name = name;
}
public void Receive(object sender,PubEventArgs e) //在事件订阅者中定义事件处理程序
{
Console.WriteLine(e.PubDate+" "+name+"已经收到了"+e.MagazineName);
}
}
class Program
{
static void Main(string[] args)
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber("张三");
Subscriber ls = new Subscriber("李四");
Pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive); //向事件发行者订阅一个事件
Pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive);
Pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
Pub.issueComputer("电脑杂志",Convert.ToDateTime("2006-1-1"));
Pub.issueLife("生活杂志",Convert.ToDateTime("2006-6-1"));
Console.ReadKey();
}
}
疑问:1.PubComputerEventHandler handler = PubComputer;
handler是一个委托类型,PubComputer是声明的一个事件,这句话代表什么意思呢?
2.handler(this,e);
这句话就彻底不理解了。
还望高手们不吝赐教,指点一下我们这些初学者。 --------------------编程问答-------------------- 说明一下啊,本人不是高手,也是一直小鸟飞啊飞。。
你这里说的委托和事件
先理解一句话:委托 就是可以把方法当做参数进行传递的,事件 其实可以说是一个特殊的委托吧,它是有1个或N个委托组合起来的委托。
PubComputerEventHandler handler = PubComputer 这句话很好理解,就是申明嘛,以委托PubComputerEventHandler 为类型。
就比如 Class A =a;
这个时候 handler 就是一个事件,然后有一个名字叫:委托链。你现在就可以把一个一个很委托类似的方法加到这里来handler。就比如你这里的电脑杂志,当电脑杂志发行的时候,只要调用 OnPubComputer 这个事件,就会自动的对那些订阅的人进行通知,很方便。
这样子吧我找了几份资料给你看看:
http://www.cnblogs.com/lovebaobao/archive/2008/12/17/1356769.html
http://zzk.cnblogs.com/s?w=%E4%BA%8B%E4%BB%B6%E5%92%8C%E5%A7%94%E6%89%98
你去看看吧!!~ --------------------编程问答-------------------- 委托可以视为一种特殊的类
事件可以视为一个类型为指定委托类的一个实例
handler(this,e) 是调用委托的方法,当handler是事件名称时就是触发事件了
PubComputerEventHandler handler = PubComputer; 其实就是将事件PubComputer的引用赋值给handler这个类别为PubComputerEventHandler的实例;
相当于
Object a = new Object();//定义对象a
Object b = a;//将a的引用赋值给b,结果是b与a有相同的引用,从内存空间来看就是指向同一个内存空间
a相当于PubComputer
b相当于handler
Object相当于PubComputerEventHandler
至于handle(this,e)就是委托的特殊之处了,handle与一系列形如 void Method(object sender,PubEventArgs e)的方法相关联
执行handle(this,e)就是按顺序执行这些相关联的方法 --------------------编程问答-------------------- 事件和委托其实是同样的东西,都是一个特殊类的对象,只是事件在操作上有些限制,事件和委托可以互相赋值,
补充:.NET技术 , C#