多くの場合、フィールドのような eventを使用できます。たとえば、次のように宣言します。
public event EventHandler<MagazineEventArgs> MagazineChangedEvent;
これは、プライベート デリゲート フィールドと、それにサブスクライブしてサブスクライブ解除するアクセサーを宣言することとほぼ同じです。
private EventHandler<MagazineEventArgs> magazineChanged;
public event EventHandler<MagazineEventArgs> MagazineChangedEvent
{
add { magazineChanged += value; }
remove { magazineChanged -= value; }
}
...しかし、フィールドのようなイベント構文は、スレッドの安全性をさらに高めます。そのスレッド セーフの正確な性質は、使用している C# のバージョンによって異なります。C# 4 以降では、以前よりも少しすっきりしています。詳細については、Chris Burrows のブログ投稿 (パート 1、パート 2、パート 3、あとがき) を参照してください。
通常、イベント サブスクリプションを別EventHandlerList
の基になるイベントにチェーンする場合や、さまざまなイベントのスパース サブスクリプションを効率的に格納する方法として使用する場合など、かなり異なることを行う場合にのみ、自分でイベントを実装する必要があります。
イベントとプレーン デリゲート フィールドの違いを理解することが重要です。これは、プロパティとフィールドの違いに似ていますが、イベントには「サブスクライブとサブスクライブ解除」操作しかなく、呼び出し元がそれらを発生させたり、他のサブスクライバーを決定したりする方法がないため、わずかに微妙な違いがあります。詳細については、トピックに関する私の記事を参照してください。