VB.NETの深淵へ:実行時型情報(RTTI)で「動的な判断力」を実装する
こんにちは。現場で長年VB.NETと向き合ってきた皆さんに、一つ伺いたいことがあります。
「渡されてきたオブジェクトが、本当に自分の期待している型なのか、確信を持って処理できていますか?」
プログラムを書いていると、どうしても「このリストには色々な種類の部品が入っているけれど、特定の部品だけ特別な処理をしたい」という場面に遭遇します。ここで迷わず、そして安全に型を判別できるかどうかが、初級者と中級者の決定的な分かれ道です。
今日は、VB.NETが持つ強力な武器、実行時型情報(RTTI: Run-Time Type Information)の使いこなし術を伝授します。
—
1. なぜ「型の判別」が必要なのか?
VB.NETは「静的型付け言語」です。基本的にはコンパイル時に型が確定しますが、`Object`型や基底クラス(`Control`型や`Shape`型など)を扱う場合、実行時に「今、目の前にあるのが何者なのか」を判断しなければなりません。
これを怠ると、不意の `InvalidCastException`(型変換エラー)が発生し、アプリは無慈悲にクラッシュします。そうならないための守護神が `TypeOf…Is` と `GetType` です。
—
2. TypeOf…Is 演算子:安全な「身分証明」の確認
`TypeOf…Is` は、オブジェクトが特定の型、あるいはその派生型であるかを `Boolean` で返します。最も安全で、かつ直感的な書き方です。
実践コード:UIコントロールの動的制御
例えば、フォーム上のすべてのコントロールを巡回して、テキストボックスだけをクリアしたい場合、このように書きます。
.net
‘ フォーム上のコントロールを一つずつ確認
For Each ctrl As Control In Me.Controls
‘ TypeOf…Is を使って、そのコントロールが TextBox かどうかを判定
If TypeOf ctrl Is TextBox Then
‘ 安全にキャストして処理を行う
Dim tb As TextBox = DirectCast(ctrl, TextBox)
tb.Clear()
Console.WriteLine($”テキストボックス ‘{tb.Name}’ をクリアしました。”)
End If
End If
ここがポイント:
`TypeOf…Is` は、継承関係も考慮します。例えば `Button` は `ButtonBase` を継承していますが、`TypeOf btn Is ButtonBase` と書けば `True` が返ります。「大雑把に分類したいとき」と「厳密に型を知りたいとき」で使い分けられるのが強みです。
—
3. GetType 演算子:型そのものを「値」として扱う
一方、`GetType` は型そのものを表す `Type` オブジェクトを返します。`TypeOf…Is` との違いは、「継承関係を無視した、厳密な一致」を判定できる点にあります。
実践コード:厳密な型比較
「継承先を含まない、まさにその型そのもの」を特定したい場合に使います。
.net
Dim myObj As Object = New Button()
‘ GetTypeは厳密な一致を見る(継承関係は無視)
If myObj.GetType() Is GetType(Button) Then
Console.WriteLine(“これは純粋な Button 型です。”)
ElseIf myObj.GetType() Is GetType(Control) Then
Console.WriteLine(“これは純粋な Control 型です。”)
End If
注意点:
`TypeOf` は演算子ですが、`GetType` はメソッドのように振る舞う演算子です。`Is` 演算子と組み合わせることで、「型が一致するか?」という比較が可能になります。
—
4. プロの現場での使い分け:TryCastとの合わせ技
現場のコードで最も洗練されているのは、`TypeOf…Is` で確認した後に `DirectCast` するのではなく、`TryCast` を活用する方法です。
.net
‘ TypeOf…Is で確認し、TryCast で変換する一連の流れ
Dim tb As TextBox = TryCast(ctrl, TextBox)
If tb IsNot Nothing Then
‘ ここで tb は既に TextBox として安全に使える
tb.Text = “更新完了”
Else
‘ TextBox でなかった場合の処理
End If
`TryCast` は変換に失敗しても例外を出さず `Nothing` を返します。これと `IsNot Nothing` を組み合わせることで、「判定」と「変換」をスマートに両立させることができます。
—
まとめ:あなたのコードは、もっと賢くなれる
今回のまとめです。
- `TypeOf…Is`: 継承関係を含めた判定が得意。まずはここから使おう。
- `GetType`: 型そのものの厳密な一致を調べたいときに使う。
- `TryCast`: 判定と変換を同時に行うプロの作法。例外を回避する守りの要。
これらを使いこなせれば、複雑なUI制御や、汎用的なデータ処理クラスを組む際に、迷うことはなくなります。「エラーが出るから」とキャストを避けるのではなく、実行時型情報という「レンズ」を通して、オブジェクトの正体を確実に見極めてください。
ここをクリアすれば、VB.NETの基本はもうバッチリです。自信を持って、より柔軟で堅牢なコードを書いていきましょう。応援しています!
