Looking for c# Answers? Try Ask4KnowledgeBase
Looking for c# Keywords? Try Ask4Keywords

C# Languageイベント


前書き

イベントとは、何かが発生したこと(マウスクリックなど)や、場合によっては(価格変更など)起こりそうなことの通知です。

クラスはイベントを定義することができ、そのインスタンス(オブジェクト)はこれらのイベントを発生させることがあります。たとえば、Buttonには、ユーザーがクリックしたときに発生するClickイベントが含まれている場合があります。

イベントハンドラは、対応するイベントが発生したときに呼び出されるメソッドです。フォームには、ボタンに含まれるすべてのボタンのClickedイベントハンドラが含まれています。

パラメーター

パラメータ詳細
EventArgsT EventArgsから派生し、イベントパラメータを含む型。
イベント名イベントの名前。
ハンドラー名イベントハンドラの名前。
SenderObject イベントを呼び出すオブジェクト。
EventArguments イベントパラメータを含むEventArgsT型のインスタンス。

備考

イベントを起こすとき:

  • デリゲートがnullかどうかを常にチェックしnull 。 nullデリゲートは、イベントにサブスクライバがないことを意味します。サブスクライバのないイベントを発生させると、 NullReferenceExceptionが発生します。
6.0
  • nullを確認する前に、デリゲート(eg EventName )をローカル変数( eventName )にコピーして、イベントを発生させます。これにより、マルチスレッド環境での競合状態が回避されます。

間違っている

    if(Changed != null)      // Changed has 1 subscriber at this point
                             // In another thread, that one subscriber decided to unsubscribe
        Changed(this, args); // `Changed` is now null, `NullReferenceException` is thrown.

    // Cache the "Changed" event as a local. If it is not null, then use
    // the LOCAL variable (handler) to raise the event, NOT the event itself.
    var handler = Changed;
    if(handler != null)
        handler(this, args);
6.0
  • ifステートメント内のサブスクライバのヌルチェックではなく、ヌル条件付き演算子(?)を使用してメソッドをEventName?.Invoke(SenderObject, new EventArgsT());EventName?.Invoke(SenderObject, new EventArgsT());
  • Action <>を使用してデリゲート型を宣言する場合、匿名メソッド/イベントハンドラのシグネチャは、イベント宣言の宣言された匿名デリゲート型と同じである必要があります。

イベント 関連する例