年なのですぐに忘れる、このブログはもともと忘れたときのための備忘録だ。
C#のdelegateはCでいうところの関数ポインタだ。
C#なので関数リファレンスと言えるだろう。
delegate void DelegateAho(int a); // DelegateAhoはこんな格好ですと宣言 static void Main(string[] args) { DelegateAho delegateAho = Aho; // delegateAhoはメッソドAhoですとインスタンスする // これはC#1.1ではDelegateAho delegateAho = new DelegateAho(Aho);とする delegateAho(1); // ここでAhoを実行するためのDelegateAhoのインスタンスであるdelegateAhoを引数付きで呼ぶ } static void Aho(int a) { Console.WriteLine("{0} is called", a); }
FormにButton(名前button1)を張り付けて、それがClickされた時のイベントハンドラーは通常こうなっている。
VSが自動的に生成してInitializeComponent()の最後に追加しているはずだ。
this.button1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.OnButton1Click); // もっと省略してthis.button1.MouseClick += this.OnButton1Click;でもよい
これはもう少しきちんと書くとこうなる。
public Form1() { InitializeComponent(); System.Windows.Forms.MouseEventHandler mouseEventHandler = new System.Windows.Forms.MouseEventHandler(this.OnButton1Click); // System.Windows.Forms.MouseEventHandlerはdelegateなので、上記のC#1.1の記法でmouseEventHandlerはメソッドthis.OnButton1Clickですとインスタンスしている this.button1.MouseClick += mouseEventHandler; // MouseClickのイベントハンドラにmouseEventHandlerを追加 } private void OnButton1Click(object sender, MouseEventArgs e) { MessageBox.Show("Aho"); }