为什么我们需要C#中的EventArgs类?

时间:2015-11-13 02:58:50

标签: c# delegates

我知道event关键字的目的只是与+=运算符配对使用,以制作delegate列表。在构造委托时,我们可以为与该委托兼容的方法制作任何签名(参数)。

例如,我创建委托

public delegate void StartEventHandler(object sender, StartEventArgs e);
带有两个参数的

:第一个带有type对象,第二个带有StartEventArgs类型。但是在我在互联网上找到的许多article中,该委托的第二个参数必须继承EventArgs类型。为什么我们这样做而是让第二个参数来自/继承任意类型?

1 个答案:

答案 0 :(得分:4)

你不需要并且我确信如果你使用了一个任意的基类,代码仍然会编译,但它是一个约定。

约定很好,因为它使得那些不熟悉您的代码的人更容易理解。如果我在C#中订阅一个事件,我希望有一个特定的方法签名。

这也很好,因为它可以使不同类型的事件互换。

例如,假设你有三个代表

public delegate void AEventHandler(object sender, AEventArgs e);
public delegate void BEventHandler(object sender, BEventArgs e);
public delegate void CEventHandler(object sender, CEventArgs e);

您可以编写一个符合所有三个委托的泛型方法,因为所有args对象都从同一个基类继承。

public void eventMethod(object sender, EventArgs e) {
    // Any one of the events fired
}

public void subscribeToEvents() {
    eventA += new AEventHandler(this.eventMethod);
    eventB += new BEventHandler(this.eventMethod);
    eventC += new CEventHandler(this.eventMethod);
}

如果您知道期望的类型,甚至可以投票

public void eventMethod(object sender, EventArgs e) {
    // Any one of the events fired
    if (e is BEventArgs) {
        // Event type B fired
        var eventB = e as BEventArgs;
        eventB.doSomething()
    }
}