c# - 内置类型的通用 EventArgs

标签 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));
    }
}

或者事件不是将数据传递给订阅者的最佳方式?

最佳答案

简短回答:视情况而定。

可以考虑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/

相关文章:

c# - 无法删除 streamReader.ReadLine 添加的反斜杠 - c sharp

python - 在 Windows 下删除或禁用可调整大小的 Tkinter 窗口最大化按钮

HTML5 颜色输入事件在颜色选择器中鼠标弹起时触发

javascript - mouseup 事件并不总是被触发

java - 如何避免 @SuppressWarnings({ "unchecked", "rawtypes"}) 无处不在?

java - 在 Java 泛型方法中使用正则表达式

c# - foreach 循环无法识别对象类型

c# - 扩展方法和新发布的扩展程序集

java - 下面的方法定义是什么意思?

c# - XmlTextReader 问题