私はちょうど静的イベントが存在することを認識しました - そして、私は人々がそれらをどのように使用するのか不思議です。私は相対比較が静的メソッドとインスタンスメソッドにどのように影響するのだろうかと思います。たとえば、静的メソッドは基本的にグローバル関数です。しかし、私はいつもイベントをのオブジェクトのインスタンスに関連付けていましたが、私はそれらをグローバルレベルで考えるのに問題があります。ここでC#で静的イベントと非静的イベントを比較するにはどうすればよいですか?
それは説明を助けている場合を参照するためにいくつかのコード:
void Main()
{
var c1 = new C1();
c1.E1 +=() => Console.WriteLine ("E1");
C1.E2 +=() => Console.WriteLine ("E2");
c1.F1();
}
// <<delegate>>+D()
public delegate void D();
// +<<event>>E1
// +<<class>><<event>>E2
// +F()
// <<does>>
// <<fire>>E1
// <<fire>>E2
public class C1
{
public void F1()
{
OnE1();
OnE2();
}
public event D E1;
private void OnE1()
{
if(E1 != null)
{
E1();
}
}
static public event D E2;
static private void OnE2()
{
if(E2 != null)
{
E2();
}
}
}
このように、サブスクライバのリストはクラスレベルにも正しく設定されていますか?同時に購読している複数のスレッドが悪いことにつながるのでしょうか? –
静的イベントのデフォルトの実装では、 'Interlocked.CompareExchange'が使用されます。これは、レースの場合、スレッドの1つがサブスクライブされないことを意味します。 – cdhowie
@cdhowie:それは 'Interlocked.CompareExchange'の非常にばかげた使い方です。通常、比較とスワップはリトライループとペアになっています。 –