C#のdelegate(再び)

年なのですぐに忘れる、このブログはもともと忘れたときのための備忘録だ。
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");
        }