FreeStyleVisionFreeStyleVisionネクストビジョン社員による情報配信を行っているブログです。Dr.Kツイート前回の記事の中では、スレッド処理をおこない、Delegateを利用してメソッドを呼び出す処理をおこないました。DelegateについてはC#.NETで見かけることはあったのですが、VB.NETではほとんど利用したことが無かったため、これを機会にDelegateがどのようなものか、どういった場面で使えばよいかを紹介していきたいと思います。Delegateとは何か、というところから。Wikipediaよりデリゲートは、オブジェクトへの参照と関数オブジェクトへの参照をペアにして持つものである。オブジェクト指向プログラミングとしては、メソッドをカプセル化するクラスとも言える。型安全であるという特徴がある。...私はこれだけ読んでも、意味がよく分かりませんでした。Pascal(Delphi)の「インスタンスのメソッドへのポインタを格納する、メソッドポインタ」と同様のものである(DelphiもC#もアンダース・ヘルスバーグによる設計である)。Frameworkのデリゲートはこれらを発展させたものである。C++は少しかじっていたことがあったので、「関数を指すポインタ」と同様、というところでピンときたのですが、意味合いとしては関数を変数にセットしておき、必要な場面でその変数(=関数)を呼び出し実行する、ようなイメージになると思います。Delegateがない場合、関数を呼び出すときにはその場で関数を呼び出す記述が必要でしたが、Delegateを利用すれば、処理分岐などのタイミングで関数をセット、後に処理を呼び出す、という使い方もできそうです。いうわけで、簡単なサンプルとして、2つの数値を足し算、または掛け算するWindowsアプリケーションを作成してみます。以下のような画面を用意しておきます。ボタンクリック時の処理を実装します。Classこのプログラムを実行してみると、以下のような動きになります。ポイントとしては、Button1_Clickイベント中のSelect文で、コンボボックスの内容に応じてDelegateの処理内容を分岐させ、全体の造りを共通化しています。今回のようにDelegateから呼び出す関数の引数と戻り値が一致していたからこそ共通化できたわけですが、同じ処理を2種類用意したり、クラスの継承などで共通化したりする必要がない分、Delegateを利用して処理を共通化できる場面は多くなると思います。今回はDelegateについて、実装の方法と利用場面について紹介しました。Delegateはイベントの処理などでも利用されているのですが、VB.NETではあまり意識しなくてもイベント処理が実装できてしまいます。VB.NETの仕組みを理解するうえでもDelegateは重要な部分の為、今後も色々な使い方について紹介していければと思います。(7)ライセンスについてFreeStyleVisionに掲載しているソースコードは、基本的に修正BSDライセンスに従うものとします。それ以外のライセンスを指定させて頂く場合は記事内にその旨を別途記載させて頂きます。Reserved.株式会社ネクストビジョン。