About
Visual C#
統合開発環境ツール:Visual Studio 2008 Professional
データベース:SQL Server 2005 Developer Edition
OS:Windows7 RC

Objective-C
統合開発環境ツール:Xcode3.1.2
OS:Mac OS X v10.5.7 Leopard
  C#   ASP.NET   Link   Contact
         
イベント機能
 
  無料のExpress Editionはこちらから  
 
 

開発環境

統合開発環境:
Visual Studio 2008 Professional
使用OS:
Windows7 RC

 
 

  イベントの使い方

イベントとは、プログラム実行中に何らかの事象が発生したとき、あらかじめ登録しておいたメソッドを実行する機能の事です。あらかじめ登録したメソッドを実行するということは、イベントはデリゲートによって実現されています。

イベントを利用するためには、メソッドを登録するためのデリゲートを宣言します。これは通常のデリゲートの宣言と変わりません。
1
修飾子 delegate 戻り値型 デリゲート名(引数1, 引数2, 引数3); //デリゲートの宣言

次に、イベントを発生させる側のクラスにイベントを宣言します。デリゲート型の変数を宣言するときのように記述しますが、イベントとして使用する場合はevent修飾子を指定します。
1
デリゲート名 修飾子 event 変数名 //イベントを宣言

最後に、イベントが発生したときのメソッドを登録します。イベントにメソッドを追加する場合は複合代入演算子を使用します。もちろん、登録できるのはデリゲートの宣言時に指定したシグネチャと同じシグネチャを持つメソッドのみです。また、イベント発生時に実行されるメソッドのことをイベントハンドラと呼び、イベントにメソッドを代入する作業をイベントハンドラの登録と言います。
1
イベント名 += メソッド名; //メソッドを代入

イベントを発生させるには、デリゲートのときと同じようにイベント名を指定して、メソッドを間接的に呼び出します。
1
2
3
イベント名(); //戻り値、引数共に指定されていない場合
変数 = イベント名(); //戻り値が指定されている場合
変数 = イベント名(引数1. 引数2, 引数3...); //戻り値、引数共に指定されている場合

以下のプログラムは、実際にイベントを実装し、イベントを発生させるプログラム例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   delegate void EventDelegate(); //デリゲートの宣言
   class Program
   {
      static public event EventDelegate myEvent; //イベントの宣言
      static void Main(string[] args)
      {
         myEvent += method; //イベントハンドラの登録
         show();
         Console.ReadLine();
      }
      static public void show()
      {
         myEvent(); //イベントの発生
      }
      static public void method() //イベントハンドラの実装
      {
         Console.WriteLine("イベントが発生しました");
      }
   }
}

実行結果
1
イベントが発生しました

このプログラムでは、8行目で戻り値、引数ともに指定しないデリゲートを宣言し、11行目でEventDelegate型のイベント、「myEvent」を宣言しています。14行目では、この「myEvent」イベントが発動したときに22行目で実装されている「method」メソッドを呼び出すよう、イベントハンドラを登録しています。

15行目の「show」メソッドが呼び出されると、20行目にあるとおり「myEvent」イベントが発生します。イベントが発生すると、イベントに登録されているイベントハンドラ、「method」メソッドが呼ばれ、コンソール画面にイベントが発生したことを通知する仕組みです。

  具体的なコーディング例

イベント機能は、このようにひとつのクラス内で使用するよりも、他のクラスで何らかのイベントが発生したとき、自分が持っているメソッドや他のクラスが持つ特定のメソッドを実行したいときによく使われます。

以下のプログラムは、他のクラスから発生したイベントの通知を受け、あらかじめ登録したイベントハンドラを実行するプログラム例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   delegate void EventDelegate(int n); //デリゲートの宣言
   class Program
   {
      static void Main(string[] args)
      {
         Class obj = new Class();
         obj.myEvent += method; //イベントハンドラの登録
         obj.calc();
         Console.ReadLine();
      }
      static public void method(int n) //イベントハンドラの実装
      {
         if (n != 50)
         {
            Console.WriteLine(string.Format("iの値が{0}になりました", n));
         }
         else
         {
            Console.WriteLine("iの値が50になりましたので演算を終了します");
         }
      }
   }
   class Class
   {
      public event EventDelegate myEvent; //イベントの宣言
      public void calc()
      {
         int i = 0;
         while(i<=50)
         {
            if (i % 10 == 0)
            {
               myEvent(i);
            }
            i++;
         }
      }
   }
}

実行結果
1
2
3
4
5
6
iの値が0になりました
iの値が10になりました
iの値が20になりました
iの値が30になりました
iの値が40になりました
iの値が50になりましたので演算を終了します

今回のプログラムでは、8行目でint型の引数1つを取得するデリゲートを宣言しています。イベントの宣言は32行目で、イベントの発生は40行目で行われます。イベントハンドラは18行目で実装されており、int型の引数を得るメソッドとして実装されています。

では、プログラムの流れを見てみましょう。まずは13行目で「Class」型のインスタンス、「obj」を生成しています。次の行ではイベントハンドラとして、18行目の「method」メソッドを登録しました。15行目では「obj」インスタンスの「calc」メソッドを呼び出し、処理は「calc」メソッドに移動します。

「calc」メソッドは変数「i」の値をwhileステートメントを使用して1ずつ加算していくメソッドです。加算していく過程で、変数「i」が10で割り切れる値ならイベントを発動させ、引数として「i」の値を指定します。このとき、イベントが発動した時点で登録しているイベントハンドラ「method」メソッドが呼ばれます。

「method」メソッドは引数の値が50でなければ引数の値をコンソール画面に出力し、50ならば演算が終了したことをコンソール画面で知らせます。このように、「myEvent」イベントは、「i」の値が10で割り切れる数字になるたびに呼び出され、登録されているイベントハンドラを呼び続けます。この繰り返しは36行目で指定している通り、「i」の値が50になるまで繰り返されます。

今回のプログラム例のように、イベントの呼び出しと発生は必ずしも同じクラスでなくても構いません。また、引数を指定すれば、ある条件に達したときにイベントを発動させ、イベントハンドラの実行に必要な引数を引き渡すことも可能です。
   
Search:

Count:
inserted by FC2 system