C#委托事件不好的做法?

时间:2016-09-06 13:23:16

标签: c#

我在代码中使用了很多自定义事件,并且已经像这样声明了它们

public delegate void ImageDownloadingEvent(Waypoint waypoint);
public event ImageDownloadingEvent ImageDownloading;

然后像这样解雇他们

if (ImageDownloading != null)
    ImageDownloading(waypoint);

我想知道的是,这是一种不好的做法吗?或者糟糕的做事方式?如果是这样,为什么?什么是更好的方法?

感谢您的帮助,只是努力提高我的编码技能

2 个答案:

答案 0 :(得分:3)

您可以自行决定事件是否是适用于给定方案的正确模式。像任何东西一样,它们可以正确使用,也可以变成代码气味。如果您不想为每个事件声明一个新类型,则可以使用您自己的声明的委托,或者FuncEventHandlerAction等更通用的委托。

您对事件的使用大多是正确的。您想将处理程序复制到本地。 Eric Lippert解释了为什么on his blog

所以它变成了这个:

var imageDownloading = ImageDownloading;
if (imageDownloading != null)
    imageDownloading(waypoint);

你喜欢C#6编译器can do this

ImageDownloading?.Invoke(waypoint);

在这种情况下,编译器首先知道它应该制作本地副本。

答案 1 :(得分:1)

你可以这样做,虽然在多线程环境中你提升它们的方式有可能出现竞争条件。因此,提出事件的推荐方法实际上是

var handler = ImageDownloading;
if (handler != null) handler(waypoint);

使用C#6,使用空条件运算符可以更简洁:

ImageDownloading?.Invoke(waypoint);

同样,仅在涉及多线程时才相关。无论如何,大多数代码都不是为这种情况而构建的。

然后问题是您是要为每个事件使用自定义委托,还是为每个事件使用自定义EventArgs(并将它们声明为EventHandler<T>)。这完全取决于你,但 是.NET中的一种约定。