在C#中实现事件

时间:2014-01-29 20:55:24

标签: c# events delegates

是的,我已经阅读了所有可以获得的页面,它们提供了在C#(123)中简单实现事件的功能。我无法让我的活动奏效。我正在从VB.net移植一个程序,在那里它非常容易使用事件。

所以提升事件的班级:

class TickerClass
    {

        // Event Setup
    public EventArgs e = null;
    public delegate void UpdateEventHandler(TickerClass t, EventArgs e);
    public event UpdateEventHandler Update;

    void doSomethingAndRaiseTheEvent()
    {
        Update(this, null);
    }
}

实例化TickerClass并处理事件的类:

public class Engine
{

   TickerClass ticker;

   // constructor
   public Engine()
   {
       ticker = new TickerClass();

       // subscribe to the event
       ticker.Update += new TickerClass.UpdateEventHandler(TickerUpdated);
   }

   // method to call when handling the event
   public void TickerUpdated()
   {
    //do stuff with ticker
   }

}

此实施有什么问题?

2 个答案:

答案 0 :(得分:4)

您的事件处理程序与用于定义事件的委托的签名不匹配,因为我确定您收到的错误消息告诉您。

偶数签名表示它接受TickerClassEventArgs作为方法的参数。你的事件处理程序都没有。

修复签名后,示例将正常运行。

请注意,没有任何特殊原因可以定义您自己的自定义委托;你只需使用Action,只是为了方便起见。

添加事件处理程序时,您也不需要显式声明委托的类型。在给定ticker.Update += TickerUpdated时,编译器可以推断它。

答案 1 :(得分:3)

TickerUpdated需要具有与UpdateEventHandler定义匹配的签名:

public void TickerUpdated(TickerClass sender, EventArgs e)
{
    // This will work now

请注意,在提升事件时,不是传递null,而是使用EventArgs.Empty也是一个好主意,并且还会以惯用方式检查处理程序上的null:

void doSomethingAndRaiseTheEvent()
{
    var handler = this.Update;
    if (handler != null)
        handler(this, EventArgs.Empty);
}