0

次の行とのインターフェースがあります。

event EventHandler<MagazineEventArgs> MagazineChangedEvent;

インターフェイスを実装すると、Visual Studio によって次のテンプレートが生成されます。

event EventHandler<MagazineEventArgs> IMagazineConfigView.MagazineChangedEvent
{
     add { throw new NotImplementedException(); }
     remove { throw new NotImplementedException(); }
}

ただし、これらのプロパティをどのように使用すればよいか正確にはわかりません。

4

1 に答える 1

3

多くの場合、フィールドのような 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の基になるイベントにチェーンする場合や、さまざまなイベントのスパース サブスクリプションを効率的に格納する方法として使用する場合など、かなり異なることを行う場合にのみ、自分でイベントを実装する必要があります。

イベントとプレーン デリゲート フィールドの違いを理解することが重要です。これは、プロパティとフィールドの違いに似ていますが、イベントには「サブスクライブとサブスクライブ解除」操作しかなく、呼び出し元がそれらを発生させたり、他のサブスクライバーを決定したりする方法がないため、わずかに微妙な違いがあります。詳細については、トピックに関する私の記事を参照してください。

于 2014-05-14T11:55:11.450 に答える