海报在 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));
}
}
或者事件不是将数据传递给订阅者的最佳方式?
最佳答案
简短回答:视情况而定。
可以考虑EventArgs<T>
类 Tuple<T>
用于向/从方法传递和返回数据。在一些简单的情况下和内部使用 Tuple<T>
是合适的,但对于更复杂的情况或公共(public)表面,使用单独的类型会更合适。
与 EventArgs<T>
我们或多或少有同样的困境。对于内部使用,可以使用这种类型,但对于公共(public) API,它可能会导致维护噩梦。
在您的特定情况下,似乎可以使用 EventArgs<T>
乍一看,但如果稍后您决定向其中添加一些附加信息,甚至像 EndPoint
会怎么样? ?在这种情况下,您可以使用 EventArgs<T, U>
(如 Tuple<T, U>
)或者您可以切换到自定义 EventArgs
类(class)。在这两种情况下,您都会破坏所有客户,如果您只有此代码的一个客户 - 没关系,但如果不是......
最重要的是,对于内部内容,可以使用 EventArgs,但对于公共(public)表面,我建议使用自定义事件参数。
附言事件的一般命名约定是 CamelCase,在您的特定情况下,这意味着 DataReceived
是更适合您的事件的名称。
关于c# - 内置类型的通用 EventArgs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9654718/