我在代码中使用了很多自定义事件,并且已经像这样声明了它们
public delegate void ImageDownloadingEvent(Waypoint waypoint);
public event ImageDownloadingEvent ImageDownloading;
然后像这样解雇他们
if (ImageDownloading != null)
ImageDownloading(waypoint);
我想知道的是,这是一种不好的做法吗?或者糟糕的做事方式?如果是这样,为什么?什么是更好的方法?
感谢您的帮助,只是努力提高我的编码技能
答案 0 :(得分:3)
您可以自行决定事件是否是适用于给定方案的正确模式。像任何东西一样,它们可以正确使用,也可以变成代码气味。如果您不想为每个事件声明一个新类型,则可以使用您自己的声明的委托,或者Func
,EventHandler
或Action
等更通用的委托。
您对事件的使用大多是正确的。您想将处理程序复制到本地。 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中的一种约定。