C#のイベント

 データに何らかの処理がなされると、それに応じて画面表示を行わなければなりません。1つのデータに対して、表示用のオブジェクトが複数あることは多いです。

 例えばエクスプローラのフォルダーは、ツリービューとリストビューのどちらにも表示されます。もしどちらかでフォルダーを削除すると、リストビューとツリービューの両方のフォルダーアイコンが消えます。

 このような場合、表示用のクラスでフォルダーの削除などの処理をするとソースコードが複雑になりがちです。そこで表示を行うクラスは本当に表示だけ任せることにして、管理用のクラスを1つ作り、データの変更などはそのクラスで行います。管理用のクラスでデータを変更後、表示用のクラスを更新するという手順を踏むようにします。

 C#では、このような処理を行うための簡便な方法としてイベント処理機構が用意されています。イベントを利用したサンプルのソースコードを示します。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication
{
  /// <summary>
  /// イベントを発生元を表します。
  /// </summary>
  public class EventGenerator
  {
    public event EventHandler TestPrint=delegate { };

    public void StartEvent()
    {
      Console.WriteLine("イベントを発生させます。");
      TestPrint(this,null);
    }
  }

  /// <summary>
  /// イベント発生時の処理を表します。
  /// </summary>
  public class EventExample
  {
    private void EventGenerated(object sender,EventArgs e)
    {
      Console.WriteLine("イベントが発生しました。");
    }

    /// <summary>
    /// イベント補足クラスを生成します。
    /// </summary>
    /// <param name="generator">イベントの発生元を表すEventGenerator</param>
    public EventExample(EventGenerator generator)
    {
      generator.TestPrint+=EventGenerated;
    }
  }
  
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("コンソールのテストを始めます。");
      EventGenerator generator=new EventGenerator();
      EventExample example=new EventExample(generator);
      generator.StartEvent();
    }
  }
}

 イベントを発生させるのメソッドはEventManagerクラス、イベントが発生したときに実行されるメソッドはEventExampleクラスに書かれています。Programクラスはメインルーチンを含みます。

 画面表示処理の例では、EventExampleクラスが画面表示クラスに相当し、EventManagerクラスが管理用のクラスに相当します。