デリゲート

スポンサーリンク

デリゲート

デリゲート (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);
スポンサーリンク