C# 动作/委托风格问题

9
什么被认为是事件定义更好的风格:

在事件定义中,哪种方式被认为是更好的风格:

public event Action<object, double> OnNumberChanged;

或者

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

第一种方法打字更少,但委托方法为参数命名。当我输入这些内容时,我认为第二种方法是获胜者,但我可能错了。
编辑:另一种(第三种)方法是获胜者。请阅读下文。

1
如下所述,使用EventHandler<T>可以更清晰地表达。值得一提的是,我维护了一个托管在CodePlex上的库,可以让你将EventHandler<T>的用法转换为Action<object, T>,反之亦然。请参见http://jolt.codeplex.com/Wiki/View.aspx?title=Jolt.Functional获取更多信息。 - Steve Guidi
@Brad Bruce,他指的不是答案序列,而是第三种与他最初的两个想法不同的技术。我稍微重新措辞了问题和接受的答案,以使其更清晰。 - Aardvark
5个回答

16

既不是1也不是2。第三个选项才是胜利者。

public event EventHandler<NumberChangedEventArgs> NumberChanged;

你正在违反一些用于开发C#的样式指南,例如使用不扩展EventArgs的事件参数类型。
是的,你可以以这种方式做,因为编译器并不在意。然而,阅读你代码的人会感到困惑。

我想补充一下,对于属性更改通知事件,可能不需要自定义EventArgs,因为更改应该已经通过发送方的属性反映出来了。+1风格指南参考。 - tia

11

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

public event Action<object, double> OnNumberChanged;
< p > ActionFunc 委托家族存在的原因就是为了达到这个目的,减少开发者需要创建新委托类型的需求。


2
通常我会使用一个派生自EventArgs类的参数。这使得代码更加一致。
我有一个类:
public class ApplyClickedEventArgs : EventArgs  
{  
   ...
}

还有一个处理程序:

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

声明如下:
public event EventHandler<ApplyClickedEventArgs> ApplyClicked;

1
与所有关于编码风格的问题一样。选择您喜欢的方式,或者您的团队喜欢的方式,并在整个项目中保持一致。只要每个需要使用它的人都可以有效地阅读它,您就不会有问题。

0

如果让我选择,我认为选项1更好,但是据我所记,官方活动指南规定你的第二个参数必须是一个名为XxxEventArgs的类,并且应该在其继承链中具有EventArgs


1
是的,你说得对。他们还建议不要以“On”开头命名事件,而是将其保留给用于触发事件的受保护方法。 - Rob Levine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接