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

本文关键字:中的 EventArgs 我们 为什么 | 更新日期: 2023-09-27 18:21:41

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

例如,我创建代理

public delegate void StartEventHandler(object sender, StartEventArgs e);

具有两个参数:第一个具有类型对象,第二个具有类型StartEventArgs。但在我在互联网上发现的许多文章中,该委托的第二个参数必须继承EventArgs类型。为什么我们这样做是为了让第二个参数来自/继承自任意类型?

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

您不需要,我相信如果您使用任意基类,代码仍然会编译,但这是一种约定。

约定是好的,因为它使那些还不熟悉您的代码的人更容易理解。如果我在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()
    }
}