C#でAndAlso・OrElseはどう書く?VB.NETとの対応表と実行例


VB.NETのAndAlsoは、C#では&&と書きます。OrElseに対応するのは||です。

一方、Andは&、Orは|に対応します。記号が1個か2個かで、右側の処理を実行する条件が変わるため、VB.NETの条件式をC#へ移すときは区別します。

VB.NETとC#の対応表

以下は、左右の式がBoolean/boolの場合の対応です。整数のビット演算や、独自型で演算子を定義した場合は対象に含めません。

VB.NETC#条件右側の式を評価しない場合
AndAlso&&両方が真左側が偽
And&両方が真なし(左側が偽でも評価)
OrElse||どちらかが真左側が真
Or|どちらかが真なし(左側が真でも評価)

左側だけで答えが決まったとき、右側の評価を省くことを「短絡評価」と呼びます。たとえば「会員であり、有効期限内」という条件では、会員でなければ期限を調べずに偽と判断できます。

対象はC#の通常のbool条件式です。掲載したC#コードはWindows 11・.NET SDK 10.0.101のコンソールアプリで確認しています。コード例ごとにProgram.csへ貼り付けて実行できます。

AndAlsoをC#へ書き換える例

VB.NETで、文字列がNothingでないことを確認してから長さを調べる式は、次の形です。

Dim name As String = Nothing
If name IsNot Nothing AndAlso name.Length > 0 Then
    Console.WriteLine("入力あり")
End If

C#ではNothingをnull、AndAlsoを&&に置き換えます。

using System;

string? name = null;
if (name != null && name.Length > 0)
{
    Console.WriteLine("入力あり");
}
Console.WriteLine("確認終了");

この例の出力は「確認終了」だけです。name != nullが偽なので、name.Lengthは評価されません。nameを"田中"に変えると、「入力あり」も表示されます。

OrElseは、たとえばname Is Nothing OrElse name.Length = 0という式を、C#のname == null || name.Length == 0へ書き換える場合に使います。こちらは左側が真なら右側を省略します。

&&と&、||と|で呼び出し回数を比べる

結果の真偽だけを見ると、違いを見落としがちです。右側のメソッドが何回呼ばれたか数えると、評価の違いを確認できます。

using System;

int calls = 0;
bool Check()
{
    calls++;
    return true;
}

bool left = false;
bool result = left && Check();
Console.WriteLine($"&&: {result}, calls={calls}");

calls = 0;
result = left & Check();
Console.WriteLine($"&: {result}, calls={calls}");

left = true;
calls = 0;
result = left || Check();
Console.WriteLine($"||: {result}, calls={calls}");

calls = 0;
result = left | Check();
Console.WriteLine($"|: {result}, calls={calls}");

実行結果は次のとおりです。

&&: False, calls=0
&: False, calls=1
||: True, calls=0
|: True, calls=1

今回の例では真偽の結果は同じですが、Check()の実行回数が違います。右側にログ出力や値の更新がある場合、記号を変えるとその処理が実行されなくなることがあります。

両方のチェックを実行したいなら、先にそれぞれの結果を別変数へ代入すると、意図が読み取りやすくなります。「2個のほうが速そう」という理由だけで、既存コードを一括置換するのは避けます。

nullチェックで&にすると例外になる

次の例は、先ほどの&&を&に変えた場合です。違いを確認するため、例外を捕まえて型名を表示します。

using System;

string? name = null;
try
{
    // ! は警告を抑えるだけで、nullを別の値には変えません。
    bool hasName = (name != null) & (name!.Length > 0);
    Console.WriteLine(hasName);
}
catch (NullReferenceException ex)
{
    Console.WriteLine(ex.GetType().Name);
}

出力はNullReferenceExceptionです。&では左側が偽でも右側へ進み、nullの文字列から長さを取得しようとするためです。

この用途では&&を使い、nullチェックを左側に置きます。左右を逆にしてname.Length > 0 && name != nullと書くと、チェックより先に長さを取得してしまいます。

書き換えがうまくいかない場合

  • AndAlsoやOrElseでコンパイルエラーになる:C#の演算子名ではありません。&&/||へ置き換えます。
  • bool?に&&や||を使っている:この対応表はbool向けです。nullを偽として扱ってよい要件なら、flag == trueなどで判定してから組み合わせます。
  • 整数の&や|を置換している:整数ではビット演算です。条件式の書き換えとは分けて扱います。

VB.NETから移すときは、対応表に加えて「右側が実行されなくてもよいか」「左側の確認が右側の前提になっているか」を読むと、動作の変化を見つけやすくなります。

関連記事・参考資料

公式仕様の確認日:2026年9月19日。