■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(); }
|
|