カテゴリ: VB.NET 更新日: 2026/02/08

VB.NETでデリゲートを使ったメソッド参照の仕組みを理解しよう

VB.NETでデリゲートを使ったメソッド参照の仕組み
VB.NETでデリゲートを使ったメソッド参照の仕組み

先生と生徒の会話形式で理解しよう

生徒

「先生、VB.NETでメソッドを変数みたいに扱うことはできますか?」

先生

「はい、それがデリゲートです。デリゲートを使うと、メソッドを参照して、後で呼び出したり、他のメソッドに渡したりできます。」

生徒

「ちょっと難しそうです…。どういう仕組みなんですか?」

先生

「簡単に言うと、デリゲートはメソッドの『住所』を保存する箱のようなものです。その箱を使って、好きなタイミングでメソッドを呼び出せます。」

1. デリゲートとは?

1. デリゲートとは?
1. デリゲートとは?

VB.NETのデリゲートは、特定のシグネチャ(引数の型や戻り値の型)を持つメソッドを参照できる型です。簡単に言えば「メソッドの参照を保存するための変数」です。例えば、ボタンが押された時に呼び出すメソッドや、計算結果を処理するメソッドなどを動的に変更できるのが利点です。

2. デリゲートの宣言方法

2. デリゲートの宣言方法
2. デリゲートの宣言方法

まず、デリゲートを使うには、Delegateキーワードで宣言します。引数や戻り値の型を指定しておく必要があります。


Delegate Sub MyDelegate(message As String)

この例では、message As Stringを受け取り、戻り値がないメソッドを参照できるデリゲートMyDelegateを作成しています。

3. デリゲートにメソッドを割り当てる

3. デリゲートにメソッドを割り当てる
3. デリゲートにメソッドを割り当てる

作ったデリゲートにメソッドを割り当てることで、そのメソッドを呼び出すことができます。


Sub ShowMessage(msg As String)
    Console.WriteLine("メッセージ: " & msg)
End Sub

Dim del As MyDelegate
del = AddressOf ShowMessage
del("こんにちは!") ' メッセージ: こんにちは! が表示される

ポイントはAddressOfを使って、メソッドの「住所」をデリゲートに渡すことです。

4. 複数のメソッドをデリゲートで呼び出す

4. 複数のメソッドをデリゲートで呼び出す
4. 複数のメソッドをデリゲートで呼び出す

デリゲートは複数のメソッドをまとめて呼び出すこともできます。これをマルチキャストデリゲートと呼びます。


Sub Hello(msg As String)
    Console.WriteLine("Hello " & msg)
End Sub

Sub Bye(msg As String)
    Console.WriteLine("Bye " & msg)
End Sub

Dim del2 As MyDelegate
del2 = AddressOf Hello
del2 += AddressOf Bye
del2("VB.NET")  
' 出力:
' Hello VB.NET
' Bye VB.NET

このように、一つのデリゲートから複数のメソッドを順番に呼び出すことができます。

5. デリゲートを使うメリット

5. デリゲートを使うメリット
5. デリゲートを使うメリット

デリゲートを使うと、次のようなメリットがあります。

  • メソッドを変数として扱えるため、処理の切り替えが簡単にできる。
  • イベントやコールバック処理の実装が容易になる。
  • 同じ処理を複数のメソッドで再利用したいときに便利。
  • プログラムの柔軟性と保守性が向上する。

特にイベント駆動型のアプリケーションでは、デリゲートは欠かせない仕組みです。

6. まとめの前に知っておきたいポイント

6. まとめの前に知っておきたいポイント
6. まとめの前に知っておきたいポイント

デリゲートは初心者にとって少し難しく感じるかもしれませんが、イメージとしては「メソッドの住所を保存して、後で呼ぶための変数」と考えると理解しやすいです。AddressOfでメソッドをデリゲートに登録し、呼び出すときは通常の変数のように使用できます。また、マルチキャストデリゲートで複数のメソッドを一度に呼び出せることも覚えておくと、VB.NETでの柔軟なプログラミングが可能になります。

まとめ

まとめ
まとめ

VB.NETにおけるデリゲートの仕組みについて、基本的な定義から具体的な活用方法まで詳しく解説してきました。デリゲートは、オブジェクト指向プログラミングにおいて非常に強力な武器となります。単に「メソッドを呼び出す」という行為を、「どのメソッドを呼び出すかを動的に決定する」という一歩進んだ設計へと昇華させてくれるからです。

デリゲートの核心を再確認する

これまでの内容を振り返ると、デリゲートの本質は「型の安全性を持った関数ポインタ」であると言えます。プログラムを実行している最中に、状況に応じて実行する処理を差し替えられる柔軟性は、大規模なシステム開発や、ユーザーインターフェースが複雑なアプリケーションにおいて欠かせない要素です。例えば、データの並び替え(ソート)を行う際に、昇順で並べるのか降順で並べるのかという「比較ルール」だけをデリゲートとして外部から渡すことで、ソートの本体ロジックを共通化するといったスマートな実装が可能になります。

実践的なサンプルプログラム:計算処理の動的切り替え

デリゲートの実践的な使い方として、二つの数値に対して異なる演算を適用する例を見てみましょう。このプログラムでは、足し算と掛け算のメソッドを同じデリゲート型で管理し、必要に応じて呼び出し先を切り替えています。


Module Module1
    ' 二つの整数を受け取り、整数を返すデリゲートの宣言
    Delegate Function CalcDelegate(x As Integer, y As Integer) As Integer

    ' 加算を行うメソッド
    Function Add(a As Integer, b As Integer) As Integer
        Return a + b
    End Function

    ' 乗算を行うメソッド
    Function Multiply(a As Integer, b As Integer) As Integer
        Return a * b
    End Function

    Sub Main()
        ' デリゲート変数の宣言
        Dim operation As CalcDelegate

        ' 足し算を割り当てる
        operation = AddressOf Add
        Dim res1 As Integer = operation(10, 5)
        Console.WriteLine("加算の結果: " & res1)

        ' 実行時に掛け算へ切り替える
        operation = AddressOf Multiply
        Dim res2 As Integer = operation(10, 5)
        Console.WriteLine("乗算の結果: " & res2)

        Console.ReadLine()
    End Sub
End Module

実行結果は以下の通りです。


加算の結果: 15
乗算の結果: 50

SEOの観点から見たデリゲートの重要性

VB.NETの学習において、デリゲートを理解することは、その先にある「イベント(Event)」や「ラムダ式」、そして非同期処理である「Async/Await」の理解に直結します。現代のプログラミングでは、一つの処理が終わるのを待ってから次へ進む直列的な書き方だけでなく、何かのアクションに反応して動くイベント駆動型の設計が主流です。デリゲートをマスターしておくことで、.NET Frameworkや.NET 5以降の最新環境においても、汎用性が高く保守しやすいコードを書くことができるようになります。

また、マルチキャストデリゲートを利用した通知の仕組みも非常に有用です。一つのイベントに対して複数のリスナー(処理)を登録できるため、ログ出力を行いながら画面を更新し、さらにデータベースへ保存するといった、複数の後続処理を一行のデリゲート呼び出しで完結させることができます。

先生と生徒の振り返り会話

生徒

「先生、まとめまで読んでみて、デリゲートの使いどころがかなり具体的に見えてきました。要するに、処理の中身を後から差し替え可能なパーツのように扱えるということですね!」

先生

「その通りです。素晴らしい理解ですね。プログラムをガチガチに固めてしまうのではなく、デリゲートという『遊び』の部分を作ることで、拡張性の高いコードになります。サンプルコードで見たように、同じ変数名(operation)なのに、中身のメソッドを入れ替えるだけで結果が変わるのが面白いところでしょう?」

生徒

「はい!AddressOfというキーワードが、そのメソッドを指し示す指印のような役割をしているのも分かりやすかったです。マルチキャストデリゲートで、プラス演算子を使ってメソッドを追加できるのも直感的で驚きました。」

先生

「そうですね。ただ、マルチキャストデリゲートを使うときは、戻り値がある場合に最後のメソッドの結果しか受け取れないという点には注意が必要ですが、基本的には一斉通知のような仕組みに最適です。このデリゲートの概念が、VB.NETの『イベント』の正体なんですよ。ボタンをクリックしたときにメソッドが動くのは、内部でデリゲートがそのメソッドを保持して実行しているからなんです。」

生徒

「なるほど、普段何気なく使っているButton_Clickとかも、デリゲートの仕組みの上に乗っかっているんですね。点と線がつながった気がします!」

先生

「それは良かったです。デリゲートを使いこなせれば、複雑な条件分岐(If文だらけのコードなど)を減らして、スッキリとした設計に作り替えることもできます。ぜひ、実際の開発でも活用してみてくださいね。」

生徒

「ありがとうございます!次はラムダ式や匿名メソッドについても、このデリゲートの知識をベースに勉強してみようと思います!」

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NET Web APIとMVCの違いを完全解説!初心者でもわかるWebアプリとAPIの基本
New2
ASP.NET
ASP.NET開発環境構築|コマンドライン(dotnet CLI)でASP.NETプロジェクトを作成する方法
New3
VB.NET
VB.NETで文字列を綺麗に整える!String.Formatと文字列補間の使い方
New4
ASP.NET
LinuxでASP.NET Coreを動かす手順|初心者でもわかる開発環境構築ガイド
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETのJoinメソッドを徹底解説!バラバラの文字列を一つに結合する方法
No.2
Java&Spring記事人気No2
VB.NET
VB.NETの配列(Array)の作り方と基本操作を徹底解説!初心者でもわかる入門ガイド
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの文字列置換を完全解説!初心者でもわかるReplaceメソッドの使い方
No.4
Java&Spring記事人気No4
VB.NET
VB.NETで文字列結合を高速化!StringBuilderクラスの使い方を完全ガイド
No.5
Java&Spring記事人気No5
VB.NET
VB.NETのList(Of T)の使い方を完全ガイド!初心者が最初に覚えるべきリスト操作
No.6
Java&Spring記事人気No6
VB.NET
VB.NETのDictionaryを完全ガイド!初心者でもわかる辞書の基本と応用
No.7
Java&Spring記事人気No7
VB.NET
VB.NETでStaticメソッドを定義する方法と活用例
No.8
Java&Spring記事人気No8
VB.NET
VB.NETのTrimで空白削除!初心者向け文字列整形完全ガイド