方法: イベント サブスクリプションとサブスクリプションの解除 (C# プログラミング ガイド)How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

別のクラスによってパブリッシュされるイベントが発生したときに呼び出されるカスタム コードを作成するときは、そのイベントをサブスクライブします。You subscribe to an event that is published by another class when you want to write custom code that is called when that event is raised. たとえば、ユーザーがボタンをクリックしたらアプリケーションで何かを行うには、ボタンの click イベントをサブスクライブします。For example, you might subscribe to a button's click event in order to make your application do something useful when the user clicks the button.

Visual Studio IDE を使ってイベントをサブスクライブするにはTo subscribe to events by using the Visual Studio IDE

  1. デザイン ビューに [プロパティ] ウィンドウが表示されない場合は、イベント ハンドラーを作成するフォームまたはコントロールを右クリックして、[プロパティ] を選びます。If you cannot see the Properties window, in Design view, right-click the form or control for which you want to create an event handler, and select Properties.

  2. [プロパティ] ウィンドウの [イベント] ボタンをクリックします。On top of the Properties window, click the Events icon.

  3. 作成するイベントをダブルクリックします (Load イベントなど)。Double-click the event that you want to create, for example the Load event.

    Visual C# によって空のイベント ハンドラー メソッドを作成され、コードに追加されます。Visual C# creates an empty event handler method and adds it to your code. または、コード ビューを使って手動でコードを追加することもできます。Alternatively you can add the code manually in Code view. たとえば、次のコード行では、Form クラスで Load イベントが発生すると呼び出されるイベント ハンドラー メソッドを宣言しています。For example, the following lines of code declare an event handler method that will be called when the Form class raises the Load event.

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    イベントをサブスクライブするために必要なコード行も、プロジェクトの Form1.Designer.cs ファイルの InitializeComponent メソッドに自動的に生成されます。The line of code that is required to subscribe to the event is also automatically generated in the InitializeComponent method in the Form1.Designer.cs file in your project. 次のようなコードです。It resembles this:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

プログラムでイベントをサブスクライブするにはTo subscribe to events programmatically

  1. シグネチャがイベントのデリゲート シグネチャと一致するイベント ハンドラー メソッドを定義します。Define an event handler method whose signature matches the delegate signature for the event. たとえば、イベントが EventHandler デリゲート型に基づいている場合は、次のコードがメソッド スタブを表します。For example, if the event is based on the EventHandler delegate type, the following code represents the method stub:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. 加算代入演算子 (+=) を使って、イベントにイベント ハンドラーをアタッチします。Use the addition assignment operator (+=) to attach your event handler to the event. 次の例では、publisher オブジェクトに RaiseCustomEvent という名前のイベントがあるものとします。In the following example, assume that an object named publisher has an event named RaiseCustomEvent. イベントをサブスクライブするには、サブスクライバー クラスがそのパブリッシャー クラスを参照する必要があることに注意してください。Note that the subscriber class needs a reference to the publisher class in order to subscribe to its events.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    上の構文は、C# 2.0 で新しく追加されたものです。Note that the previous syntax is new in C# 2.0. これは、new キーワードを使ってカプセル化するデリゲートを明示的に作成する必要がある C# 1.0 の構文と完全に同等です。It is exactly equivalent to the C# 1.0 syntax in which the encapsulating delegate must be explicitly created by using the new keyword:

    publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);  
    

    イベント ハンドラーは、ラムダ式を使って追加することもできます。An event handler can also be added by using a lambda expression:

    public Form1()  
    {  
        InitializeComponent();  
        // Use a lambda expression to define an event handler.  
        this.Click += (s,e) => { MessageBox.Show(  
           ((MouseEventArgs)e).Location.ToString());};  
    }  
    

    詳細については、「方法 :LINQ 以外でラムダ式を使用する」をご覧ください。For more information, see How to: Use Lambda Expressions Outside LINQ.

匿名メソッドを使ってイベントをサブスクライブするにはTo subscribe to events by using an anonymous method

  • 後でイベントのサブスクリプションを解除する必要がない場合は、加算代入演算子 (+=) を使って匿名メソッドをイベントにアタッチできます。If you will not have to unsubscribe to an event later, you can use the addition assignment operator (+=) to attach an anonymous method to the event. 次の例では、publisher オブジェクトに RaiseCustomEvent という名前のイベントがあり、CustomEventArgs クラスもある種の特別なイベント情報を保持するように定義されているものとします。In the following example, assume that an object named publisher has an event named RaiseCustomEvent and that a CustomEventArgs class has also been defined to carry some kind of specialized event information. イベントをサブスクライブするには、サブスクライバー クラスがその publisher クラスを参照する必要があることに注意してください。Note that the subscriber class needs a reference to publisher in order to subscribe to its events.

    publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)  
    {  
      string s = o.ToString() + " " + e.ToString();  
      Console.WriteLine(s);  
    };  
    

    匿名関数を使ってイベントをサブスクライブした場合、簡単にはイベントのサブスクリプションを解除できないことに注意することが重要です。It is important to notice that you cannot easily unsubscribe from an event if you used an anonymous function to subscribe to it. このシナリオでサブスクリプションを解除するには、イベントをサブスクライブするコードに戻り、匿名メソッドをデリゲート変数に格納して、イベントにデリゲートを追加する必要があります。To unsubscribe in this scenario, it is necessary to go back to the code where you subscribe to the event, store the anonymous method in a delegate variable, and then add the delegate to the event. 一般に、後のコードでイベントのサブスクリプションを解除する必要がある場合は、イベントのサブスクライブに匿名関数を使わないことをお勧めします。In general, we recommend that you do not use anonymous functions to subscribe to events if you will have to unsubscribe from the event at some later point in your code. 匿名関数について詳しくは、「匿名関数」をご覧ください。For more information about anonymous functions, see Anonymous Functions.

サブスクリプションの解除Unsubscribing

イベントが発生したときにイベント ハンドラーが呼び出されないようにするには、イベントからサブスクリプションを解除します。To prevent your event handler from being invoked when the event is raised, unsubscribe from the event. リソースのリークを防ぐには、サブスクライバー オブジェクトを破棄する前に、イベントのサブスクリプションを解除する必要があります。In order to prevent resource leaks, you should unsubscribe from events before you dispose of a subscriber object. イベントのサブスクリプションを解除するまで、パブリッシュ側オブジェクトでイベントの基盤になっているマルチキャスト デリゲートは、サブスクライバーのイベント ハンドラーをカプセル化するデリゲートへの参照を保持しています。Until you unsubscribe from an event, the multicast delegate that underlies the event in the publishing object has a reference to the delegate that encapsulates the subscriber's event handler. パブリッシュ側オブジェクトがその参照を保持している限り、ガベージ コレクションはサブスクライバー オブジェクトを削除しません。As long as the publishing object holds that reference, garbage collection will not delete your subscriber object.

イベントのサブスクリプションを解除するにはTo unsubscribe from an event

  • イベントのサブスクリプションを解除するには、減算代入演算子 (-=) を使います。Use the subtraction assignment operator (-=) to unsubscribe from an event:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    すべてのサブスクライバーがイベントのサブスクリプションを解除すると、パブリッシャー クラスのイベント インスタンスは null に設定されます。When all subscribers have unsubscribed from an event, the event instance in the publisher class is set to null.

参照See Also