2016-09-06 123 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中的約定。