delegate : 関数を変数に保持するための定義。
匿名メソッド : deletgateの関数を変数に代入する手間を省き直接定義できるように。
ラムダ式 : 匿名メソッドをもっとシンプルに定義できるように。
// デリゲート
class Practice10_1
{
// デリゲート (Cでいう関数ポインタのようなもの)
// 戻り値と型が同じなら代入できる。
delegate void EventPart(string s);
static void Main(string[] args)
{
// デリゲード
Show1();
// 匿名メソッド
Show2(delegate(string name) { Console.WriteLine(name + "エフェクトを発生させる。"); });
// ラムダ式
Show2((String name) => Console.WriteLine("name + エフェクト発生"));
}
// デリゲード
static void Show1()
{
EventPart eventParts;
var eventManager = new EventManager();
// 複数のメソッドを登録する。
eventParts = eventManager.Wait;
eventParts += eventManager.Action1;
eventParts += new EventPart(eventManager.Action2); // new演算子を使った書き方も可
// 追加した全てのメソッドを実行する。
eventParts("");
// 削除もできる。
eventParts -= eventManager.Action1;
eventParts("");
}
// 匿名メソッド
static void Show2(Action<string> action)
{
action("");
}
}
class EventManager
{
public void Action1(string name)
{
Console.WriteLine(name + ":文字を表示する。");
}
public void Action2(string name)
{
Console.WriteLine(name + "キャラクターを移動させる。");
}
public void Wait(string name)
{
Console.WriteLine(name + "待ち時間");
}
}