デリゲート。意味は「代理人」
「delegate」は色々な呼び方がある。
→匿名メソッド、無名メソッド、匿名関数。
「delegate」
使用例を見てみる。
//匿名メソッドの「型」(引数と戻り値)の宣言のみ
//TestMethod「型」がdelegateで宣言されている
public delegate void TestMethod(string s);
//ボタンクリック時イベント
private void button1_Click(object sender, EventArgs e)
{
//delegateで宣言してある「TestMehod型」の変数に
//匿名メソッドの処理をdelegateで書いて格納する
TestMethod test1 = delegate (string msg)
{
MessageBox.Show(msg+"1");
};
//ラムダ式バージョン(処理内容は同じ)
TestMethod test2 = (msg) => {
MessageBox.Show(msg+"2");
};
//個々のメソッドとして使用できる。
test1("メッセージ"); //「メッセージ1」と表示
test2("メッセージ"); //「メッセージ2」と表示
}
要するに、変数をメソッドとして扱いたいのである。匿名メソッドを作る為の型を作る必要があり、
「引数と戻り値の数」だけを宣言する為に「delegate」が使われている。
(c++だと関数ポインタ、std::function)
「Action」「Func」
「Action」と「Func」は「定義済みデリゲート」。
「delegate」の宣言が「Action」と「Func」で既に宣言してある為、
「delegate」の宣言が必要ない。
その為、当然使いやすい。
//「Action」は 「戻り値無し」
//「Func」は 「戻り値有り」
//引数や戻り値の型を<>内に指定。
//引数:void
//戻り値:void → 「Acton」を使う
Action act1 = () =>
{
MessageBox.Show("a");
};
//引数:string
//戻り値:void → 「Acton」を使う
Action<string> act2 = (valueStr) =>
{
MessageBox.Show(valueStr);
};
//引数:int,int
//戻り値:string → 「Func」を使う
Func<int, int, string> funcAdd = (x, y) =>
{
return (x + y).ToString();
};
//処理結果
act1(); //「a」
act2("abc"); //「abc」
MessageBox.Show(funcAdd(1,2)); //「3」
デリゲートはその場限りのメソッドを書く事が出来る。
これを「定義済みデリゲート」を使って
「Action(戻り値無し、引数16個まで)」と
「Func(戻り値有り、引数16個まで)」を使う事により、
「delegate」の宣言がいらなくなり、
ラムダ式で書けば、かなりスマートに書く事が出来る。
ラムダ式で書いた匿名メソッド(delegate)の受け皿に
delegate型(「Action」「Func」型)の変数を使うイメージとなる。
delegate型の変数はメソッドとして使用できる。
他
他には「マルチキャストデリゲート」というのがある。
1つのデリゲート変数に、複数の無名メソッドを代入する事ができる。
これは、代入した無名メソッドの呼び出し順が保証されていない為、
あまり使わない方がよさそう…。
「MethodInvoker」の説明はしませんでした。
「Action」と「MethodInvoker」は同じ物です。
「Action」を利用しましょう。
以下サイトを参考にしました。
http://9cubed.info/article/delegate/
0 件のコメント:
コメントを投稿