using System;
namespace Chapter01All
{
// とても簡単なイベントの例
// イベント用のデリゲートの宣言
delegate void MyEventHandler(); //←イベントで使うデリゲートを宣言する
// イベントの送信側のクラス
class MyEvent
{
public event MyEventHandler SomeEvent; //←イベントを宣言する
// イベント送信を実装したメソッド
public void Fire()
{
if (SomeEvent != null)
SomeEvent(); //←イベントを送信する
}
}
class OtherEvent
{
public event MyEventHandler anOtherEvent;
public void Water()
{
if (anOtherEvent != null)
anOtherEvent();
}
}
class EventDemo
{
static void Handler()
{
Console.WriteLine("Event fire occurred");
}
static void OtherHandler()
{
Console.WriteLine("Event water occurred");
}
static void Main()
{
MyEvent evt = new MyEvent(); //←イベントを送信する側のインスタンスを作成する
// ハンドラをイベントリストに追加する
evt.SomeEvent += Handler; //←イベントのチェーンにハンドラを追加する
evt.SomeEvent += OtherHandler;
// イベントを人為的に発生させる
evt.Fire(); //←イベントを発生させる
OtherEvent oevt = new OtherEvent();
oevt.anOtherEvent += OtherHandler;
oevt.Water();
}
}
}
何回か見てはいましたが、どうもピンときません。この辺がC#を理解する上での肝かもしれません。例題と同じようにイベントを一個追加して見ました。上の例では、delegateが一個しかないので、同じように動作する場合は、問題なかったのですが、動作が違うとダメだったので、もう一つのdelegateを定義したのが、下です。
using System;
namespace Chapter01All
{
// とても簡単なイベントの例
// イベント用のデリゲートの宣言
delegate void MyEventHandler(); //←イベントで使うデリゲートを宣言する
delegate void OtherMyEventHandler(String s);
// イベントの送信側のクラス
class MyEvent
{
public event MyEventHandler SomeEvent; //←イベントを宣言する
// イベント送信を実装したメソッド
public void Fire()
{
if (SomeEvent != null)
SomeEvent(); //←イベントを送信する
}
}
class OtherEvent
{
public event OtherMyEventHandler anOtherEvent;
public void Water(String str)
{
if (anOtherEvent != null)
anOtherEvent(str);
}
}
class EventDemo
{
static void Handler()
{
Console.WriteLine("Event fire occurred");
}
static void OtherHandler(String s)
{
Console.WriteLine(s);
}
static void Main()
{
MyEvent evt = new MyEvent(); //←イベントを送信する側のインスタンスを作成する
// ハンドラをイベントリストに追加する
evt.SomeEvent += Handler; //←イベントのチェーンにハンドラを追加する
// イベントを人為的に発生させる
evt.Fire(); //←イベントを発生させる
OtherEvent oevt = new OtherEvent();
oevt.anOtherEvent += OtherHandler;
oevt.Water("Water Event Occurred");
}
}
}
イベントに引数を持たせる場合もあるでしょうから、delegateを別に作って、試行錯誤しました。