日期:2014-05-18  浏览次数:20769 次

关于委托事件event的问题(求高手大侠解答)谢谢 在线等...
代码如下:
using System;
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 event PubComputerEventHandler PubComputer;
protected virtual void onPubComputer(PubEventArgs e)
{
PubComputerEventHandler Handler=PubComputer;
if (Handler!=null)
{
Handler(this,e);
}
}
public void issueComputer(string MagazineName,DateTime PubDate)//在事件发行者中触发事件
{
Console.WriteLine("发行"+MagazineName);
onPubComputer(new PubEventArgs(MagazineName,PubDate));
}
}
class Subcriber//在事件订阅者中定义事件处理程序
{
private string name;
public Subcriber (string name)
{
this.name=name;
}
public void Receive(object sender,PubEventArgs e)
{
Console.WriteLine (e.PubDate+""+name+"已经收到"+e.MagazineName);
}
}
class story
{
static void Main()
{
Publisher Pub=new Publisher();
Subcriber zs=new Subcriber("张三");
Pub.PubComputer+= new Publisher.PubComputerEventHandler(zs.Receive);//订阅事件
Pub.issueComputer("电脑杂志",Convert.ToDateTime("2012-12-12"));
}
}
疑问:(每问20分)
1、Handler(this,e);语句中传递的this参数代表的是Handler这个委托事件本身吗?
2、this是传递给方法Receive()使用的,但是这里没有体现出this传递进去只有有什么作用。
3、类PubEventArgs为什么一定要从EventArgs 派生呢?
4、event关键字在这里去掉也可以。请问event关键字什么情况下才有用呢?event关键字的作用是什么?


------解决方案--------------------
你这里应该是Publisher的实例,就是调用Handler的那个实例
this那只是没用而已,很多事件都有一个sender,你应该知道吧,比如按钮的click,这个sender就是你点击的那个按钮,你可以不用,也可以通过它去访问是哪个对象触发的
不一定,这里只是需要而已
event,这个你看帮助解释吧,这样可以在自定义组件中的事件列表中看到你自定义的事件
------解决方案--------------------
1. this 很明确指Publisher, 指由谁发布,即时间的触发者。
2. 没错确实给Recieve()用的,这里没用到并不代表它没意义。就好象你收到一封信,总是会有个发信人一样。
3. EventArgs 是framework里面事件申明基础类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
4. 不加Event的话申明的是一个委托,加了就是一个事件。 至于事件和委托有什么区别,建议单独看看文章。
事件本身是一种特殊的委托。
------解决方案--------------------
1、Handler(this,e);语句中传递的this参数代表的是Handler这个委托事件本身吗?

不是,可以理解成执行者。

2、this是传递给方法Receive()使用的,但是这里没有体现出this传递进去只有有什么作用。

可以通过sender 得知当前的执行者的相关信息。

3、类PubEventArgs为什么一定要从EventArgs 派生呢?

EventArgs -》 Event的Args ,所有事件参数的基类
  
4、event关键字在这里去掉也可以。请问event关键字什么情况下才有用呢?event关键字的作用是什么?

具体用法参看MSDN