C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■90430 / )  Re[5]: 引数のあるメソッドをメソッドに渡す
□投稿者/ 魔界の仮面弁士 (2096回)-(2019/03/11(Mon) 10:40:39)
No90426 (B.B さん) に返信
>>えぇと…それはラムダ式とは関係ないです。(^_^:
>>Func<,> はジェネリックなデリゲート型ですね。
>
> デリゲート型というのがあるんですね(;´Д`A ```

「+=」演算子を使うと、一つのデリゲートに複数のメソッドグループを含めることもできます。(-= で削除)
イベントを割り当てる際にも使われますね。


// 「void Foo()」な呼び出しを表すデリゲート型を宣言
delegate void SampleDelegate();

private void InstanceMethod() { MessageBox.Show(nameof(InstanceMethod)); }
private static void StaticMethod() { MessageBox.Show(nameof(StaticMethod)); }

private void Form1_Load(object sender, EventArgs e)
{
 // ローカル関数
 void LocalFunction() { MessageBox.Show(nameof(LocalFunction)); };
 void ExpressionBodiedLocalFunction() => MessageBox.Show(nameof(ExpressionBodiedLocalFunction));

 // デリゲートインスタンス
 Action ActionInstance = () => MessageBox.Show(nameof(ActionInstance));
 MethodInvoker MethodInvokerInstance = () => MessageBox.Show(nameof(MethodInvokerInstance));


 // デリゲート型の変数を用意して、「+=」でつなぐ
 SampleDelegate methods = null;


 methods = delegate { MessageBox.Show("anonymous1"); }; // 匿名メソッド
 methods += delegate { MessageBox.Show("anonymous2"); }; // += で追加していける
 methods += () => MessageBox.Show("lambda"); // ラムダ式も渡せる
 methods += InstanceMethod;
 methods += StaticMethod;
 methods += LocalFunction;
 methods += ExpressionBodiedLocalFunction;
 // methods += ActionInstance; // これは NG
 // methods += MethodInvokerInstance; // これは NG
 methods += new SampleDelegate(ActionInstance); // これは OK
 methods += new SampleDelegate(MethodInvokerInstance); // これは OK


 // 割り当てられた呼び出しの数
 MessageBox.Show($"{methods.GetInvocationList().Length}", "呼び出しリストの数");

 // デリゲート呼び出し(各メソッドが登録順に呼び出される)
 methods();
}
返信 編集キー/


管理者用

- Child Tree -