内置类型的通用EventArgs

use*_*702 5 c# generics events

Are EventArg类的海报现在需要我们有泛型并且.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));
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,事件可能不是向订阅者传递数据的最佳方式?

Ser*_*kov 5

简答:这取决于.

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

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

在你的特殊情况下,EventArgs<T>乍看之下似乎可以使用,但是如果以后你会决定添加一些额外的信息EndPoint呢?在这种情况下,您可以使用EventArgs<T, U>(像Tuple<T, U>),或者您可以切换到自定义EventArgs类.在这两种情况下,你都会破坏所有客户端,如果你只有一个这个代码的客户端 - 它可以,但如果不是......

底线,对于内部的东西,可以使用EventArgs,但对于公共表面我建议使用自定义事件args.

PS事件的常规命名约定是CamelCase,在您的特定情况下,它意味着DataReceived更适合您的事件的名称.