C#の if (x is ClassA a) をVB.NETでどう書くか?

こんにちは!

今日は「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らしい書き方をうまく使えば、コードがもっと読みやすく、バグも防ぎやすくなるはずです!

「こんなケースだとどう書くの?」みたいな疑問があれば、ぜひ教えてくださいね!✨

というわけで、今日はこのへんで!