こんにちは!
今日は「C#の if (x is ClassA a) をVB.NETでどう書くか?」について、いろいろな書き方バリエーションを紹介したいと思います。
C#の if (x is ClassA a) って何?
まずC#でよく見るこの形
if (x is ClassA a)
{
// aを使った処理
}これは「xがClassA型だったら、aに代入して使う」という、型チェックと代入を同時にやってるコードですね。
さて、これをVB.NETで書き直すとどうなるか?
VB.NETで基本の書き方
VB.NETにはC#のように”is 型チェック+変数代入”を同時にやる構文はないので、こんなふうに2ステップで書きます。
Dim a As ClassA = TryCast(x, ClassA)
If a IsNot Nothing Then
' a を使った処理
End IfTryCast(x, ClassA)は、xをClassA型にキャスト。失敗するとNothingが返ります。If a IsNot Nothingで、キャスト成功かどうかをチェックします。
すこし手間ですが、VB.NETの定番パターンです!
VB.NETらしい書き方バリエーション
さてさて、ここからが本題です。 VB.NETっぽさを活かしたいろんな書き方バリエーションを紹介します!
1. もっと簡潔に書きたい派
型チェックと代入を、コンパクトにまとめたい場合はこうです。
If TryCast(x, ClassA) IsNot Nothing Then
Dim a = DirectCast(x, ClassA)
' a を使った処理
End Ifここでは、
TryCastで型チェックだけして、- 通ったら
DirectCastで本格的にキャストしてます。
「2回キャストっぽいけど大丈夫?」と思うかもしれませんが、通常のコードでは全然問題ありません。安心して使ってください。
2. 安全第一で進めたい派
とにかく安全重視、読みやすさ重視ならこれ。
Dim a = TryCast(x, ClassA)
If a IsNot Nothing Then
' a を使った処理
Else
' キャスト失敗時のフォローアップ処理も書ける!
End Ifこのパターンは、あとでaを何度も使う場合にも便利です。
3. TypeOfを使ってもっと意図を明示する派
「この変数がこの型か?をハッキリ書きたい!」という場合はこうもできます。
If TypeOf x Is ClassA Then
Dim a = CType(x, ClassA)
' a を使った処理
End IfTypeOf ... Is ...で型チェックだけ先にやる。- その後
CTypeで安全にキャストします。
一見まどろっこしいですが、”意図が明確になる”というメリットもありますね。
4. 型によって分岐したい!欲張り派
もっと応用すると、こんなこともできます。
Select Case True
Case TypeOf x Is ClassA
Dim a = CType(x, ClassA)
' a を使った処理
Case TypeOf x Is ClassB
Dim b = CType(x, ClassB)
' b を使った処理
Case Else
' どれでもない場合
End SelectSelect Case Trueを使って、型ごとに処理を分けられるスタイルです。
C#のswitch文より柔軟なので、複数型に対応したいときは超便利ですよ!
まとめ
| 目的 | 書き方 | ポイント |
|---|---|---|
| シンプルに型チェック+代入 | Dim a = TryCast(x, ClassA)+If a IsNot Nothing | よく使われる定番パターン |
| 型チェックだけ先にする | If TypeOf x Is ClassA Then | その後CTypeで安全キャスト |
| 型ごとに分岐したい | Select Case True + TypeOf | 柔軟な型ごとの分岐 |
| 型チェックだけしたい | If TypeOf x Is ClassA Then | 変数は作られないので注意 |
最後に
C#とVB.NETは似ているようで、微妙に考え方が違うところもあります。
今回紹介したVB.NETらしい書き方をうまく使えば、コードがもっと読みやすく、バグも防ぎやすくなるはずです!
「こんなケースだとどう書くの?」みたいな疑問があれば、ぜひ教えてくださいね!✨
というわけで、今日はこのへんで!
