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

2013年01月05日

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((string a) => { Debug.WriteLine(a); });

            // 匿名処理2
            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 2013-01-05 19:32 | C# | このブログの読者になる | 更新情報をチェックする


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX