VB.NETのイベント駆動を掌握せよ:HandlesとAddHandlerの「賢い使い分け」
こんにちは。現場で「なぜかフォームが閉じない」「メモリがじわじわ増える」といった不可解な現象に頭を抱えたことはありませんか?その犯人の多くは、イベントの「配線」を正しく理解していないことにあります。
VBAの「マクロの記録」から一歩踏み出し、真のVB.NETエンジニアを目指すなら、イベントのライフサイクルを支配する必要があります。今日は、その核心である`Handles`と`AddHandler`の決定的な違いと、プロが守るべき「メモリリークを防ぐ鉄則」を伝授します。
—
1. Handles:静的な「あらかじめの約束」
`Handles`は、フォームデザイン上でボタンを配置したとき、自動的に生成されるあのコードです。
.net
‘ ボタンがクリックされた時に動く、と宣言されている
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MessageBox.Show(“固定されたボタンならこれで十分です”)
End Sub
このキーワードの正体
`Handles`は、コンパイル時に「誰が・どのイベントを・どのメソッドで処理するか」をガチガチに固めてしまう仕組みです。
- メリット: 記述が簡潔で読みやすい。
- デメリット: 「あとから動的に増えたボタン」には対応できない。
「画面の構成が完成した時点で変わらない」という安定したパーツに対しては、この`Handles`を使うのが最もパフォーマンスが高く、安全です。
—
2. AddHandler:動的な「現場でのスカウト」
プログラム実行中に「ボタンを100個生成したい」という状況になったとき、`Handles`は無力です。ここで登場するのが`AddHandler`です。
.net
‘ 動的に作成したボタンにイベントを配線する例
Dim btn As New Button()
btn.Text = “動的生成ボタン”
‘ ここでイベントと処理を「接続」する
AddHandler btn.Click, AddressOf DynamicButton_Click
Me.Controls.Add(btn)
‘ — イベントハンドラ本体 —
Private Sub DynamicButton_Click(sender As Object, e As EventArgs)
MessageBox.Show(“動的に生成されたボタンが押されました!”)
End Sub
なぜこれが重要なのか?
`AddHandler`は、いわば「イベントという信号」と「処理というメソッド」をランタイム(実行時)に紐付ける強力な接着剤です。画面が動的に変化するモダンなアプリケーション開発では、避けては通れない技術です。
—
3. 【重要】メモリリークを防ぐ「RemoveHandler」の鉄則
ここからが、伝説のエンジニアへの登竜門です。
`AddHandler`で接続したイベントは、自動では解除されません。
もし、動的に生成したボタンを消去(Dispose)しても、イベントの接続が残っていると、.NETのガベージコレクタ(GC)は「まだこのオブジェクトは必要かも?」と判断し、メモリから解放してくれません。これが積み重なると、アプリは次第に重くなり、やがてクラッシュします。
「付けたら消す」。これがプロの美学です。
.net
‘ 不要になったタイミングで必ず解除する
RemoveHandler btn.Click, AddressOf DynamicButton_Click
btn.Dispose()
—
4. 陥りやすい「落とし穴」を回避するヒント
初学者がよくやるミスは、「同じイベントを何度もAddHandlerしてしまう」こと。
例えば、ボタンを更新するたびに`AddHandler`を呼び出すと、1回クリックしただけで同じ処理が2回、3回と重なって実行されるという怪奇現象が起きます。これを防ぐコツは以下の通りです。
1. イベントを配線する前に、一度RemoveHandlerを通す:
すでに接続されていたとしても、`RemoveHandler`はエラーになりません。「解除してから再接続する」という手順をルーチン化しましょう。
2. senderを信じろ:
`sender As Object`には、イベントを発生させた張本人が入っています。これを使えば、一つのメソッドで複数の動的コントロールをスマートに処理できます。
—
最後に:先輩からのアドバイス
「Handlesで書けるものをわざわざAddHandlerで書く必要はない」ということを覚えておいてください。
- 静的(固定)なもの → `Handles`:シンプルに保つ。
- 動的(流動)なもの → `AddHandler`:必要に応じて生成・解除する。
この使い分けができるようになれば、あなたのコードは格段に安定し、プロフェッショナルな品質に近づきます。VB.NETのイベント駆動は、「誰と誰をどう繋ぎ、いつその縁を切るか」というプログラミングの哲学そのものです。
さあ、恐れずに動的なUI構築に挑戦してみてください。あなたの書くコードが、もっと軽く、もっと美しくなることを期待しています!
