[ VB.NET / C# ] 条件演算子の比較対応表 ( OrElse AndAlso || && )

Pocket

ここでは、VB.NET と C# の条件演算子について掲載しています。言語が違いますので、当然のように C# と VB.NET では記述方法が異なります。下表に比較結果をまとめてみました。

スポンサーリンク

条件演算子の対応表

C# の || と && に対応するのは、VB.NET では OrElse と AndAloso 演算子になります。And や Or 演算子ではありません(後述しています)。

VB.NET C#
OR 演算 OrElse ||
AND 演算 AndAlso &&

条件演算子のサンプルコード

VB.NET

    Dim str As String 

    ' Nothing または 空文字列の場合は未入力と判断する
    If (str = Nothing OrElse str.Trim() = String.Empty) Then
        ' 何か処理する
    End If

    ' AndAlso を使用した上記と同様の処理 
    If (Not (str <> Nothing AndAlso str.Trim() <> String.Empty)) Then
        ' 何か処理する
    End If

C#

    string str = null;

    // null または 空文字列の場合は未入力と判断する
    if (str == null || str.Trim() == string.Empty) {
         // 何か処理する
    }

    // && を使用した上記と同様の処理
    if (!(str != null && str.ToString() != string.Empty)) {
        // 文字列が未入力と判断する
    }

Or 演算子と And 演算子は例外発生に注意が必要

VB6 や VB.NET には代々 Or 演算子や And 演算子が存在しています(VB.NET でも引き続き使用できます)。しかし、既に存在しているにも関わらず、わざわざ VB.NET では AndAlso や OrElse の新しい条件演算子が VB2005 から追加されました。それは、And や Or 演算子の場合には、最初の条件の真偽に関わらずに、すべてのオペランドが実行(検証)されてしまうためです(多分、メイビー、オーライです)。

先に示したサンプルを Or と And 演算子を使って、以下のように書き換えて実行してみます。

    Dim str As String ' or Dim str As String = Nothing

    ' Or の場合 OrElse とは異なり、必ず全ての比較検証が行われる。
    ' そのため、本来 str.Trim() を実行させる必要はないにも関わらず実行される。
    ' その結果 System.NullReferenceException が発生する
    If (str = Nothing Or str.Trim() = String.Empty) Then

        ' 文字列が未入力と判断する

    End If

    ' And 演算子も同様に、すべてのオペランドが検証される

すべてのオペランドが検証されてしまうため、System.NullReferenceException 例外が発生しないように書き換える必要があります。もちろん Or 演算子を用いて書き直すこともできますが、ここでは1つずつ確認するようにしています。

    Dim str As String

    If (str = Nothing) Then

        ' 文字列が未入力と判断する

    ElseIf (str.Trim() = String.Empty) Then

        ' 文字列が未入力と判断する

    End If

C# の場合や VB.NET における OrElse 演算子のように、左のオペランドから順に検証し、結果が確定した時点で 次のオペランドの検証を行わず判断を完了することを「ショートサーキット」と呼びます。
Or や And 演算子 ( VB ) は、古いバージョンで作られたアプリケーションのために残された互換性のための遺産と思っていいかもしれません。

参考
スポンサーリンク


Pocket

3 thoughts on “[ VB.NET / C# ] 条件演算子の比較対応表 ( OrElse AndAlso || && )”

  1. 通りすがり

    VB.NET以降もAND演算子・OR演算子ともにありますよ。
    また、AndAlsoはANDとは別物ですし、OrElseはORとは別物です。自身で紹介されている各ドキュメントの解説をよく読みましょう。

    1. まさお Post Author

      ご指摘ありがとうございます。文章は難しいですね。修正してみました。
      この記事に限らず、まだ内容が誤解されて伝わっていたり、わかりずらかったり
      その他、文句でも何でもOKですので、ジャンジャン突っ込みください。

  2. satriani

    「メイビー、オーライ」などと書くのは、そんなことは全く無いので削除された方が良いかと思います。
    また、AndとOrは互換性のための遺産ではありません。
    両方を常に評価したいときなどの用途として今後も必要です。

Leave a Reply to 通りすがり Cancel Reply

Your email address will not be published. Required fields are marked *