こんにちは!
今日は「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 If
TryCast(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 If
TypeOf ... 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 Select
Select 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らしい書き方をうまく使えば、コードがもっと読みやすく、バグも防ぎやすくなるはずです!
「こんなケースだとどう書くの?」みたいな疑問があれば、ぜひ教えてくださいね!✨
というわけで、今日はこのへんで!