C#でAndAlso・OrElseはどう書く?VB.NETとの対応表と実行例
VB.NETのAndAlsoは、C#では&&と書きます。OrElseに対応するのは||です。
一方、Andは&、Orは|に対応します。記号が1個か2個かで、右側の処理を実行する条件が変わるため、VB.NETの条件式をC#へ移すときは区別します。
VB.NETとC#の対応表
以下は、左右の式がBoolean/boolの場合の対応です。整数のビット演算や、独自型で演算子を定義した場合は対象に含めません。
| VB.NET | C# | 条件 | 右側の式を評価しない場合 |
|---|---|---|---|
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日。