デリゲート
スポンサーリンク
デリゲート
デリゲート (delegate) は委譲とも訳され,メソッドへの参照を保持するために用いられます。
他の言語における関数ポインタと同様の機能を持ちます。
using System;
// デリゲート型の宣言
delegate string TimeFormatterDelegate(int hour, int minute);
class Clock
{
public int Hour;
public int Minute;
// デリゲートフィールド
public TimeFormatterDelegate TimeFormatter;
public void PrintTime()
{
// デリゲートを介してメソッドを呼び出す
Console.WriteLine(TimeFormatter(Hour, Minute));
}
}
class Program
{
static void Main()
{
Clock clock = new Clock();
clock.Hour = 6;
clock.Minute = 30;
// 時刻出力用のメソッドを登録
clock.TimeFormatter = TimeFormatter1;
clock.PrintTime();
}
static string TimeFormatter1(int h, int m)
{
// string.Format は Console.WriteLine の出力と同様の
// 文字列を返り値として返す
return string.Format("{0:00}:{1:00}", h, m);
}
}
06:30
このプログラムは,TimeFormatterDelegate というデリゲート型を宣言し,Clock クラスにデリゲートフィールド TimeFormatter を持たせたものです。
Clock クラスの開発者はもはや,時刻を表示する処理の実装には立ち入っていません。
メソッドそのものはデリゲートオブジェクトではないので,次のようにインスタンス化するのが本来の書き方です。
clock.TimeFormatter = new TimeFormatterDelegate(TimeFormatter1);
匿名メソッド/ラムダ式
メソッドリテラルに相当するものとして,匿名メソッド (anonymous method),ラムダ式 (lambda expression) があります。
次のように匿名メソッド,ラムダ式を用いれば,TimeFormatter1 というメソッドを別途用意する必要はなくなります。
// 匿名メソッド
clock.TimeFormatter =
delegate(int h, int m)
{ return string.Format("{0:00}:{1:00}", h, m); };
// ラムダ式
clock.TimeFormatter =
(int h, int m) => { return string.Format("{0:00}:{1:00}", h, m); };
clock.TimeFormatter =
(h, m) => string.Format("{0:00}:{1:00}", h, m);
スポンサーリンク