5

VS 2012 中的代码分析工具对我的代码提出了一些问题。大多数都很好,这个(CA1009 正确声明事件处理程序)但是我不明白其中的原因。

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

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

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

public event Action DataChanged;

然后在其中一个使用 repo 的课程中​​我可以做

repository.DataChanged += UpdateMatchingCustomers;

private void UpdateMatchingCustomers() {
    MatchingCustomers = ...
}

为什么这是个坏主意?

4

4 回答 4

3

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

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

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

如果某个事件没有遵循他们预期的模式,如果微软的一些优秀设计师(他们肯定喜欢他们的设计师)破产,我也不会感到惊讶。

于 2012-12-30T20:38:57.290 回答
1

我会争论 EventArgs 参数,有优点和缺点。

但是发送者是必须的,如果同一个处理程序附加到多个对象,那么这就是您确定哪个实例引发事件的方式。

于 2012-12-30T21:05:03.977 回答
0

这可能看起来有点奇怪,但这条规则是有道理的,最好声明你的事件,这样你就不必创建新的委托:

public event EventHandler<CalculaMontosEventArgs> CantidadesEvent = delegate { };
public class CalculaMontosEventArgs : EventArgs
{
    public decimal Total { get; set; }

    public CalculaMontosEventArgs(decimal total)
    {
        Total = total;
    }
}
于 2014-03-12T21:53:20.080 回答
0

从性能来看,这个设计规则毫无意义,要在委托或操作中传达值类型,您需要生成一个包含值类型的引用类型......

好的,为了用户的可读性和维护,这很重要,它为类似的东西添加了上下文和含义

公共行动 MyAction;但是,代码注释也可以做到这一点......

于 2016-12-26T08:15:12.773 回答