SQLの窓 イラストAC フリー素材

2019年06月27日

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        // ▼ 宣言
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // ▼ 呼び出しタイプ1( 特定メソッド型変数にメソッド名を代入 )
            func _ptr = debug_string;
            button_action(_ptr);

            // ▼ 呼び出しタイプ2( 古い方法 )
            button_action(new func(debug_string));

            // ▼ 匿名処理1( ラムダ式 ) : button_action 内より呼び出される
            button_action((string a) => { Debug.WriteLine(a); });

            // ▼ 匿名処理2: button_action 内より呼び出される
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

そしてさらに最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


【C#の最新記事】
posted by at 2019-06-27 19:32 | C# | このブログの読者になる | 更新情報をチェックする