2016-09-06 63 views
0

我用了很多的自定义事件在我的代码,并已宣布他们这样C#委托事件不好的做法?

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

然后开除他们这样

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

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

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

回答

2

那么这是由你来决定,如果事件是用于给定的情况下正确的模式。就像任何东西一样,它们可以被正确使用,或者它们可以变成代码味道。如果您不想为每个事件声明新类型,则可以使用自己声明的委托或其中一个更通用的声明,如FuncEventHandlerAction

您对事件的使用大多正确。你想把处理程序复制到本地。埃里克Lippert有一个解释为什么on his blog

所以就变成这样:

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

的C#6编译器can do this你像这样:

ImageDownloading?.Invoke(waypoint); 

在这种情况下,编译器知道它应该做一个本地副本,第一次。

+0

只有在事件要同时从多个线程访问时才需要该代码,这很少是必需的。 – Servy

1

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

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

是用C#6,可以使用空条件运算符是一个有点更简洁:

ImageDownloading?.Invoke(waypoint); 

同样,只有当相关时多线程是一个问题。无论如何,大多数代码不是为这种情况而建的。

然后,您是要为每个事件使用自定义代表还是为每个事件使用自定义代码EventArgs(并将它们声明为EventHandler<T>)。这完全取决于你,但它是排序在.NET中的约定。