[C#] 新しいdelegate型を作る

 C#のデリゲート型変数には、メソッドを代入することができます。そして、そのメソッドを好きなタイミングで呼び出すことができます。

 デリゲート型(変数ではなく「型」)を新しく作るには以下のように記述します。

delegate void LineParseFunc(string line);

 メソッドを記述するときと似ていますが、次の点が異なります。

  1. 先頭に「delegate」がつく。
  2. メソッドの本体は書かず、引数リストの次はセミコロンで終わる。
  3. メソッド名に相当するところ(この場合はLineParseFunc)は新しく作られる型名。

 上記のデリゲート型「LineParseFunc」を宣言したのち、次のように変数を定義します。この「parse」には、string型の変数を1つだけ引数に持つ、void型のメソッドを代入できます。

// ↓クラスのフィールドや、メソッド内のローカル変数として定義
LineParseFunc parse=ParseLine;

// ↓どこかに定義されている。
void ParseLine(string line)
{
  // lineに何らかの処理を施す。
}

 以下、使用例です。

public partial class MainForm : Form
{
  void ParseLine(string line) // ★
  {
    // lineに何らかの処理を施す。
  }
  
  void button1_Clicked()
  {
    TextParser textParser=new TextParser();
    
    // ↓2つ目の実引数ParseLineは★のメソッド
    testParser.Parse(textBox1.Text,ParseLine);
  }
  
  // 他のメンバーは省略
}

public class TextParser
{
  public delegate void LineParseFunc(string line);
  
  // ↓2つ目の仮引数にメソッドが代入される。
  public void Parse(string[] text,LineParseFunc parse)
  {
    // サンプルでもエラーチェックは忘れずに!
    if(text==null || parse==null)
      throw new ArgumentNullException;
    
    for(int i=0; i<text.Length; i++)
      parse(text[i]);  // 代入したメソッドの呼び出し
  }
}