内置类型的泛型EventArgs

本文关键字:EventArgs 泛型 置类型 内置 | 更新日期: 2023-09-27 18:27:36

现在我们有泛型,并且.NET有内置的EventArgs<T>?建议不要使用通用的EventArgs,至少我有这种感觉。

当我只需要一个内置类型时,使用它是否合理?在我的特定情况下,我通过TCP从流中读取数据,当接收到数据时,会通知订阅者。

public event EventHandler<EventArgs<string>> data_received = delegate { };
...
while (!reader.EndOfStream)
{
    if ((data = reader.ReadLine()) != "")
    {
        this.data_received(this, new EventArgs<string>(data));
    }
}

或者,活动不是向订阅者传递数据的最佳方式?

内置类型的泛型EventArgs

简单回答:这取决于情况。

可以考虑使用类似Tuple<T>EventArgs<T>类来向方法传递数据和从方法返回数据。在一些简单的情况下,对于内部使用,Tuple<T>是合适的,但对于更复杂的情况或公共表面,使用单独的类型会更合适。

对于EventArgs<T>,我们或多或少有相同的dilema。对于内部使用来说,使用这种类型是可以的,但对于公共API来说,这可能会导致维护噩梦。

在您的特定情况下,乍一看使用EventArgs<T>似乎是可以的,但如果以后您决定添加一些附加信息,甚至像EndPoint一样,该怎么办?在这种情况下,您可以使用EventArgs<T, U>(如Tuple<T, U>),也可以切换到自定义EventArgs类。在这两种情况下,你都会破坏你所有的客户端,如果你只有这个代码的一个客户端,那没关系,但如果不是。。。

最重要的是,对于内部内容,使用EventArgs是可以的,但对于公共表面,我建议使用自定义事件args。

p.S.事件的一般命名约定是CamelCase,在您的特定情况下,这意味着DataReceived更适合您的事件名称。