web-dev-qa-db-ja.com

クラスにイベントを追加する方法

カエルという名前のクラスがあるとしましょう、それは次のようになります:

public class Frog
{
     public int Location { get; set; }
     public int JumpCount { get; set; }


     public void OnJump()
     {
         JumpCount++;
     }

}

2つのサポートが必要です。

  1. クラス定義にJumpという名前のイベントを作成したい。
  2. Frogクラスのインスタンスを作成してから、Frogがジャンプしたときに呼び出される別のメソッドを作成します。
42
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

その後

Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}
58

以下は、通常のEventHandlerまたはカスタムデリゲートの使用方法のサンプルです。 ?.の代わりに.を使用して、イベントがnullの場合、イベントが完全に失敗する(nullを返す)ことに注意してください。

public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;

public event EventHandler Jump;

public void OnJump()
{
    AwesomeJump?.Invoke(42);
    Jump?.Invoke(this, EventArgs.Empty);
}

サブスクライバーがいない場合、イベント自体はnullであることに注意してください。イベントが呼び出されると、イベントはスレッドセーフになります。したがって、デフォルトの空のハンドラーを割り当てて、イベントがnullでないことを確認することもできます。これは、(GetInvocationListを使用して)すべてのイベントを消去する他の誰かに対して技術的に脆弱であるため、注意して使用してください。

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
2
Tezra

@CQ:なぜJumpのローカルコピーを作成するのですか?さらに、イベントの宣言を少し変更することで、後続のテストを保存できます。

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
1
Konrad Rudolph