【发布时间】:2011-09-17 14:10:39
【问题描述】:
当我们想要将数据传递给事件订阅者时,我们使用 EventArgs(或 CustomEventArgs)。
.Net 提供了一个内置类型 EventHandler,它使用内置的 EventArgs 类的实例作为参数。
如果我需要通知订阅者某项操作已结束,例如搜索已结束,该怎么办?我什至不想使用 EventArgs,它不包含任何内容。
是否有用于向另一个类发出信号的内置类型,而无需使用空的 EventArgs?
【问题讨论】:
当我们想要将数据传递给事件订阅者时,我们使用 EventArgs(或 CustomEventArgs)。
.Net 提供了一个内置类型 EventHandler,它使用内置的 EventArgs 类的实例作为参数。
如果我需要通知订阅者某项操作已结束,例如搜索已结束,该怎么办?我什至不想使用 EventArgs,它不包含任何内容。
是否有用于向另一个类发出信号的内置类型,而无需使用空的 EventArgs?
【问题讨论】:
我真的建议你在这里使用标准的 EventHandler 模式,然后通过 EventArgs.Empty。但是,如果您真的需要,可以使用Action 作为事件类型——这很不寻常。
【讨论】:
如果你使用普通的delegates,你当然可以做你想做的事,但如果你使用events,我认为最好的办法是坚持标准,并且始终拥有object sender 和EventArgs e。
如果你真的不知道在你自己的代码中触发这些事件时要传递什么,只需传递 EventArgs.Empty 作为第二个参数。
【讨论】:
您有多种选择:
EventHandler 和基本EventArg 类的普通事件——确保事件为空,但这有什么害处吗?event MyDelegateWithoutParams MyEvent; 一起使用
IObservable 的观察者模式。Action 传递给您并调用此操作。我希望这些选项之一是您喜欢的。对于这种情况,我使用 1 和 4(如果只有一个“听众”,则主要是 4 个)。
PS:我猜 2 不符合 .NET framework guidelines,所以也许那个不是最好的主意 ;)
【讨论】:
使用操作(以下答案复制自https://stackoverflow.com/a/1689341/1288473):
声明:
public event Action EventWithoutParams;
public event Action<int> EventWithIntParam;
调用:
EventWithoutParams?.Invoke();
EventWithIntParam?.Invoke(123);
【讨论】: