C#のデリゲートの利用
C#のデリゲートを利用したコードを紹介します。
概要
デリゲートはC#でメソッドを参照できる関数ポインタのような機能です。関数型とも言えます。
用途
関数ポインタとしての用途が中心です。もっともよく利用される用途はコールバック関数としての利用です。メソッドの引数にメソッドポインタを渡し、メソッド内でコールバック関数として呼び出されます。また、処理により呼び出しメソッドが変わる場合、呼び出し先メソッドをポイントするために使われることもあります。
書式
delegate (戻り値の型) (デリゲート名)([引数1の型] [引数1の名称], [引数2の型] [引数2の名称], ...);
例
delegate int SimpleFunc(int x, int y);
サンプルプログラム
UI
以下のUIを作成します。ボタンとテキストボックスを配置します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SimpleDelegate
{
public partial class FormMain : Form
{
delegate int SimpleFunc(int x, int y);
public FormMain()
{
InitializeComponent();
}
public int AddFunc(int a, int b)
{
return a + b;
}
public int SubFunc(int a, int b)
{
return a - b;
}
private void button1_Click(object sender, EventArgs e)
{
//C# 1.0での書式
//SimpleFunc sf = new SimpleFunc(AddFunc);
SimpleFunc sf = AddFunc;
textBox1.Text += string.Format("{0:d}\r\n", sf(5, 3));
textBox1.Text += string.Format("{0:d}\r\n", sf(2, 4));
textBox1.Text += string.Format("{0:d}\r\n", sf(3, 8));
textBox1.Text += "----- \r\n";
//C# 1.0での書式
//sf = new SimpleFunc(AddFunc);
sf = SubFunc;
textBox1.Text += string.Format("{0:d}\r\n", sf(6, 2));
textBox1.Text += string.Format("{0:d}\r\n", sf(8, 2));
textBox1.Text += string.Format("{0:d}\r\n", sf(3, 1));
}
}
}
解説
delegate int SimpleFunc(int x, int y);
にて、デリゲートの宣言をします。この宣言ではSimpleFuncという名称でint型の引数を2つ持ち戻り値としてintを返す関数型を宣言しています。宣言した型と同じ型を持つメソッドを参照できます。
SimpleFunc sf = AddFunc;
上記コードにより、デリゲートに関数(メソッド)の参照を設定します。通常の変数と同様に関数名を代入する書式でデリゲートの参照を設定できます。このコードによりSimpleFunc型のsf変数はAddFuncメソッドを参照している状態になります。
textBox1.Text += string.Format("{0:d}\r\n", sf(5, 3));
textBox1.Text += string.Format("{0:d}\r\n", sf(2, 4));
textBox1.Text += string.Format("{0:d}\r\n", sf(3, 8));
sfデリゲートを経由してメソッドを呼び出します。sfはAddCFuncを参照しているため、2つの引数の和が戻り値で戻りテキストボックスに表示されます。
sf = SubFunc;
上記コードにより、sfにSubFuncの参照を設定します。この行以降sfの呼び出しはSubFuncに変わります。
textBox1.Text += string.Format("{0:d}\r\n", sf(6, 2));
textBox1.Text += string.Format("{0:d}\r\n", sf(8, 2));
textBox1.Text += string.Format("{0:d}\r\n", sf(3, 1));
sfデリゲートを経由してメソッドを呼び出します。sfの参照がSubFuncに変更されたため、引数の差の値がテキストボックスに表示されます。
実行結果
プロジェクトを実行します。プログラムが起動し下図のウィンドウが表示されます。
[button1]をクリックします。テキストボックスに下図の結果が表示されます。最初の3行はsf()に与えた引数の和が表示され、区切り以下の3行はsf()に与えた引数の差が表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用