为什么使用偏离发送方和eventargs的事件处理程序方法签名是个坏主意?

Jam*_*roe 5 c# code-analysis event-handling

VS 2012中的代码分析工具提出了我的代码的一些问题.大多数都很好,这一个(CA1009正确声明事件处理程序)然而我无法理解其推理.

如果我不需要任何数据,只是为了知道发生了什么事情,在我看来,我通过使用不需要参数的事件来模糊我的真实意图.

例如,假设我要列出符合给定条件的所有客户.如果我的存储库已更新,我需要重新检查数据.

所以我创建了一个存储库类,然后给它一个带有以下签名的DataChanged事件:

public event Action DataChanged;
Run Code Online (Sandbox Code Playgroud)

然后在其中一个使用repo的类中,我可以做

repository.DataChanged += UpdateMatchingCustomers;

private void UpdateMatchingCustomers() {
    MatchingCustomers = ...
}
Run Code Online (Sandbox Code Playgroud)

为什么这是一个坏主意?

Mat*_*nen 3

我认为主要思想是有人可能想使用相同的事件处理程序方法来处理来自多个源的事件,并且拥有匹配的签名会很有帮助:

  • 强制存在sender确保处理程序可以区分不同的事件源
  • 派生所有事件数据对象可EventArgs确保始终有正确的类型可用于数据参数

此外,拥有事件数据的基类并强制执行它可以确保扩展事件源的类可以通过现有事件发送比基类更多的数据,这确保了它是可能的(当然,这有点牵强,但我在实际程序中至少这样做过一次)。

如果微软的一些出色的设计师(他们确实喜欢他们的设计师)如果活动没有遵循他们预期的模式而崩溃,我也不会感到惊讶。