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

时间:2012-12-30 20:35:28

标签: c# event-handling code-analysis

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

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

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

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

public event Action DataChanged;

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

repository.DataChanged += UpdateMatchingCustomers;

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

为什么这是一个坏主意?

4 个答案:

答案 0 :(得分:3)

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

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

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

如果一个活动没有按照他们预期的模式,微软的一些花哨的设计师(他们肯定喜欢他们的设计师)会破产,我也不会感到惊讶。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这可能看起来有点奇怪,但是这个规则是有道理的,声明你的事件是理想的,所以你不必创建一个新的委托:

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

    public CalculaMontosEventArgs(decimal total)
    {
        Total = total;
    }
}

答案 3 :(得分:0)

来自permormance Point的

这个设计规则没有任何意义,在委托中传递值类型或者你需要生成一个包含值类型的引用类型......

好的,对于用户可读性和维护而言,这是重要的,它为

之类的内容添加了上下文和含义

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