内置类型的通用EventArgs

时间:2012-03-11 11:59:37

标签: c# events generics

Are EventArg classes needed now that we have genericsDoes .NET have a built-in 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));
    }
}

或许某个事件不是向订阅者传递数据的最佳方式?

1 个答案:

答案 0 :(得分:5)

简短回答:这取决于。

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

EventArgs<T>我们或多或少都有相同的困境。对于内部使用,可以使用此类型,但对于公共API,它可能导致维护噩梦。

在您的特定情况下,乍一看似乎可以使用EventArgs<T>,但如果稍后您决定向EndPoint添加一些其他信息,该怎么办呢?在这种情况下,您可以使用EventArgs<T, U>(例如Tuple<T, U>),也可以切换到自定义EventArgs类。在这两种情况下,你都会破坏所有客户端,如果你只有一个这个代码的客户端 - 没问题,但如果不是......

底线,对于内部资料,可以使用EventArgs,但对于公共表面,我建议使用自定义事件参数。

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