コンテンツにスキップ

デリゲート(delegate)

デリゲートの概要

デリゲートは、関数やクラスメソッドの参照を表す型です。 デリゲート型の変数には関数の参照を保存でき、また保存している関数を呼び出すことが可能です。

デリゲートを宣言する

デリゲートを利用するには、関数のシグネチャ(戻り値や引数の型情報)を指定して、デリゲート型を宣言する必要があります。

以下の形式で、デリゲート型の宣言を行います。

delegate "戻り値" "デリゲート型名"("引数1", "引数2", ...);

具体的なデリゲート型の宣言の例です。 ここでは、「戻り値の型が int で、第1引数の型が string、第2引数の型が bool」である、PerformAction型を定義しています。

// PerformAction型を宣言
delegate int PerformAction(string text, bool flag);

// 引数名は省略可能なので、このようにも宣言できます。
delegate int PerformAction(string, bool);

デリゲートを利用する

delegate型変数に関数を登録し、呼び出すコード例です。

// PerformAction型を宣言
delegate int PerformAction(string text, bool flag);

// PerformAction型の変数を定義
PerformAction action;

// 事前定義済みの関数 TestFunc を登録
action += &TestFunc;

// 登録した関数(TestFunc)を呼び出し
action("id", true);

関数の登録について

  • 関数をデリゲート型変数に登録するには、関数名の前に "&" を付ける必要があります。
  • クラスメソッドをデリゲート型変数に登録する場合、関数名がそのまま利用できます。
// 関数を定義
int TestFunc(string text, bool flag) {
    // ...
}

// 関数名の前に "&" が必要
PerformAction action = &TestFunc;
// クラスメソッドを定義
class SampleClass {
    int TestMethod(string text, bool flag) {
        // ...
    }
}

// メソッド名をそのまま利用して登録できる。
SampleClass sample = new SampleClass();
PerformAction action = sample.TestMethod;

その他の情報

デリゲートは値型

デリゲートは値型であり、つまり new を呼び出さずに生成できます。また、デリゲート型変数に null は代入できません。

また、デリゲート型変数を別の変数に代入したり、関数の引数として渡す場合、デリゲート型変数の中身が新しい変数にコピーされます。

// 初期化時に new が不要
PerformAction action;

// もう1つデリゲート型変数を定義し、代入してみる。ここでコピーが行われる。
PerformAction action2nd = action;

// action2nd に加えた変更は、action側には反映されない。逆も同じ。
action2nd += &DummyFunc;

関数を複数実行した場合の戻り値

戻り値がある関数を複数登録したデリゲートを呼び出した場合、返却される戻り値は、最後に登録された関数のものになります。


メソッド

(引数Tは、デリゲート型変数の型シグネチャに適合する関数を意味します。)

Add(T)

void Add(T func)

このオブジェクトに、引数で指定した関数を追加登録します。

関数がすでに登録済みの場合は、何も行いません。

演算子 += と同等の機能です。

Set(T)

void Set(T func)

このオブジェクトに登録されている全ての関数をクリアし、引数で指定した関数を新たに登録します。

演算子 = と同等の機能です。

Erase(T)

void Erase(T func)

引数で指定した関数がこのオブジェクトに登録されている場合、それを消去します。

関数が存在しない場合、何も行いません。

演算子 -= と同等の機能です。

Clear()

void Clear()

このオブジェクトに登録されている、全ての関数を削除します。

Count()

int Count()

このオブジェクトに登録されている関数の個数を返します。

IsEmpty()

bool IsEmpty()

このオブジェクトに登録されている関数が0個だった場合に、trueを返します。

Exist(T)

bool Exist(T func)

引数で指定した関数がこのオブジェクトに登録されている場合、trueを返します。


演算子

+= 演算子

Add() と同等の機能を持つ演算子です。

右辺に指定した関数を、オブジェクトに追加登録します。

-= 演算子

Erase() と同等の機能を持つ演算子です。

右辺に指定した関数を、オブジェクトから削除します。

= 演算子

Set() と同等の機能を持つ演算子です。

右辺に指定した関数をオブジェクトに設定し、既存の登録済み関数を全て削除します。