デリゲート 前編

リハビリ目的でC#復習中。

今回はデリゲート。

デリゲートっていうのは、「メソッド」を保持するためのデータ型のことです。

CやC++やってる人にとっちゃ複数登録が出来る関数ポインタって感じになるのでしょうか(大雑把すぎですね)

C#での主な使用用途は一度に複数の関数を呼び出したい場合やイベントハンドラなどでしょう。


■とりあえず汚いコード■

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

// デリゲートテスト
namespace ConsoleApplication1
{
// デリゲートの定義(delegate 戻り値型 デリゲート名(引数リスト) )
delegate void DelegateSimple();

class Program
{
static void Main(string[] args)
{
//---------------------------------------------------------
// 基本的な使い方
//---------------------------------------------------------
// DelegateA型の変数delAにSayHello()を登録して・・・
DelegateSimple delSayHello = new DelegateSimple(SayHello);
DelegateSimple delSayBye = new DelegateSimple(SayBye);
// delAを媒介してSayHelloをコール!
delSayHello();
// お別れの言葉も覚えましょう
delSayBye();

Console.WriteLine("--------------------------------");

//---------------------------------------------------------
// C#2.0以降ならば代入で登録も出来る。
// delgateオブジェクトに+=でメソッドの追加も可能。
// その場合コール時は登録順に逐次実行される。←並列じゃない
//---------------------------------------------------------
DelegateSimple delGreeting = SayHello;
delGreeting += SayBye;

// この状態でdelGreetingにSayHelloとSayByeが登録されているので
// コールしてみると・・・
delGreeting();

Console.WriteLine("--------------------------------");

//---------------------------------------------------------
// static、非static限らずオブジェクトメソッドの登録も可能!
//---------------------------------------------------------

// ○木と○○力がいたとして
Inoki ino = new Inoki();
Cyosyu cyo = new Cyosyu();

// 彼らの名言もデリゲートに登録する事だって出来ます。
DelegateSimple delSayWord = ino.SayAreYouFine;
delSayWord += cyo.SayIAmNotAngry;

//名言を発する
delSayWord();

}

static void SayHello()
{
Console.WriteLine("こんにちわ");
}

static void SayBye()
{
Console.WriteLine("さようなら");
}
}

// 某レスラークラス
class Inoki
{
public void SayAreYouFine()
{
Console.WriteLine("元気で○かー!?");
}
}

// 某レスラークラス
class Cyosyu
{
public void SayIAmNotAngry()
{
Console.Write("キ○てないですよ");
}
}

}



■結果■

こんにちわ
さようなら

                                                              • -

こんにちわ
さようなら

                                                              • -

元気で○かー!?
キ○てないですよ


一応「delegate」っていうのは「委譲、委託」という意味だそうです。

次は匿名メソッド、ラムダ式あたりかな。