【问题标题】:C# Action/Delegate Style QuestionC# 动作/委托风格问题
【发布时间】:2009-07-13 16:45:34
【问题描述】:

什么是事件定义的更好风格:

public event Action<object, double> OnNumberChanged;

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

第一个需要更少的输入,但委托给参数命名。当我输入这个时,我认为 2 号是赢家,但我可能是错的。

编辑:不同的(第三种)方法是赢家。阅读下文。

【问题讨论】:

  • 如下所述,使用 EventHandler 最清楚。对于它的价值,我维护了一个托管在 CodePlex 上的库,它允许您将 EventHandler 的使用转换为 Action ,反之亦然。请参阅jolt.codeplex.com/Wiki/View.aspx?title=Jolt.Functional 了解更多信息。
  • @Brad Bruce,他指的不是答案序列,而是与他最初的两个想法不同的第三种技术。我已经改写了问题并接受了稍微清晰的答案。

标签: c# .net coding-style


【解决方案1】:

1 或 2 都不是。第三个选项是赢家

public event EventHandler<NumberChangedEventArgs> NumberChanged;

您违反了使用 C# 进行开发的许多样式准则,例如使用不扩展 EventArgs 的事件参数类型。

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

【讨论】:

  • +1 样式指南参考。我只想补充一点,属性更改通知事件可能不需要自定义 EventArgs,因为更改应该已经通过发件人的属性反映出来。
【解决方案2】:

如果没有必要,不要创建新类型。我认为这样更好:

public event Action<object, double> OnNumberChanged;

ActionFunc 委托家族存在的原因就是为了达到这个目的并减少开发人员创建新委托类型的需求。

【讨论】:

    【解决方案3】:

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

    我有一堂课:

    public class ApplyClickedEventArgs : EventArgs  
    {  
       ...
    }
    

    和一个处理程序:

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

    声明是:

    public event EventHandler<ApplyClickedEventArgs> ApplyClicked;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果我选择选项 1,我认为选项 1 更好,但是 IIRC,事件的官方指南指出,您的第二个参数必须是名称为 XxxEventArgs 的类,并且应该在其继承中包含 EventArgs链。

        【讨论】:

        • 是的,你是对的。他们还建议您不要以名称“On”开始事件,而是将其保留给用于引发事件的受保护方法。
        猜你喜欢
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多