是的,我已经阅读了所有可以获得的页面,它们提供了在C#(1,2,3)中简单实现事件的功能。我无法让我的活动奏效。我正在从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
}
}
此实施有什么问题?
答案 0 :(得分:4)
您的事件处理程序与用于定义事件的委托的签名不匹配,因为我确定您收到的错误消息告诉您。
偶数签名表示它接受TickerClass
和EventArgs
作为方法的参数。你的事件处理程序都没有。
修复签名后,示例将正常运行。
请注意,没有任何特殊原因可以定义您自己的自定义委托;你只需使用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);
}