代码之家  ›  专栏  ›  技术社区  ›  Jake Pearson

行动/代表式问题

  •  9
  • Jake Pearson  · 技术社区  · 16 年前

    什么是事件定义的更好样式:

    public event Action<object, double> OnNumberChanged;
    

    public delegate void DNumberChanged(object sender, double number);
    public event DNumberChanged OnNumberChanged;
    

    第一种类型的输入较少,但委托一个为参数命名。当我打这个的时候,我认为2号是赢家,但我可能错了。

    编辑:一个不同的(第三个)方法是胜利者。在下面阅读。

    5 回复  |  直到 14 年前
        1
  •  16
  •   Aardvark    14 年前

    既不是1也不是2。第三种选择是胜利者

    public event EventHandler<NumberChangedEventArgs> NumberChanged;
    

    您违反了在C中开发的许多样式指导原则,例如使用不扩展EventArgs的事件参数类型。

    是的,您可以这样做,因为编译器不关心。但是,阅读您的代码的人会做一个WTF。

        2
  •  11
  •   Andrew Hare    16 年前

    如果不必创建新类型,则不要创建新类型。我觉得这样更好:

    public event Action<object, double> OnNumberChanged;
    

    原因是 Action Func 委托族的存在就是为了达到这个目的,减少开发人员创建新委托类型的需要。

        3
  •  2
  •   Brad Bruce    16 年前

    通常,我坚持使用EventArgs派生类作为参数。它使代码更加一致。

    我有一堂课:

    public class ApplyClickedEventArgs : EventArgs  
    {  
       ...
    }
    

    和一个处理程序:

    void cpy_ApplyClicked(object sender, ApplyClickedEventArgs e)  
    {  
       ...  
    }  
    

    声明是:

    public event EventHandler<ApplyClickedEventArgs> ApplyClicked;
    
        4
  •  1
  •   Matthew Vines    16 年前

    和所有关于编码风格的问题一样。选择你喜欢的,或者你的团队喜欢的,并在整个项目中保持一致。只要每个人都能有效地阅读它,你就没事了。

        5
  •  0
  •   Dmitri Nesteruk    16 年前

    我认为如果我要选择选项1更好,但是IIRC,官方的事件指南声明您的第二个参数必须是一个名为 XxxEventArgs ,应该有 EventArgs 在它的继承链上。