[C#] delegate part 1 (型)

C#でオブジェクト間で情報や制御をやりとりする手段として delegate typeが用意されている。delegateは、C言語的に言えば関数へのポインタである。C言語の場合、関数へのポインタは煎じつめればアドレスだけになるのに対して、C#のdelegateはシグネチャが一致する関数へのポインタとなるように型チェックがかかる。
delegateはC#コンパイラのレベルでは、classに展開される。classにnestされるclassになり、Invoke、Removeなど決まったメソッドが作られる。
主にcallback関数として使うので

  • 関数のアドレス
  • 引数の数と型
  • 返り値の型

の情報を持つ。
宣言の例。

public delegate int BinaryOp(int x, int y);

BinaryOpという名前の、返り値 int, 引数は int, int の関数のdelegate型のobjectという意味になる。
この宣言から、コンパイラは
System.MulticastDelegateからderiveされるBinaryOpという名前のsealed class を生成する。
System.MulticastDelegateはSystem.Delegateを親クラスとしてメソッドを引き継ぐ。
delegate型のオブジェクトはstaticやinstance methodをさすこともできる。
callbackではなく単なる関数ポインタとして使用したソースコード例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SimpleDelegate
{
public delegate int BinaryOp(int a, int b);
public class SimpleMath
{
public static int Add(int a, int b)
{
return (a + b);
}
public static int Sub(int a, int b)
{
return (a - b);
}
}
class Program
{
static void Main(string[] args)
{
BinaryOp bop = new BinaryOp(SimpleMath.Add);
Console.WriteLine("10 + 10 = {0}", bop(10, 10));
Console.ReadLine();
}
}
}
広告
%d人のブロガーが「いいね」をつけました。