Are EventArg classes needed now that we have generics和Does .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));
}
}
或许某个事件不是向订阅者传递数据的最佳方式?
答案 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
更适合您的事件名称。