はじめに
プログラムを書いている際、
「条件分岐でなぜかエラー(NullReferenceExceptionなど)が発生して止まってしまう」という経験はありませんか?
それは、条件の判定方法である「ショートサーキット評価」を正しく活用できていないからかもしれません。
本記事では、VB.NETなどで使われる AndAlso 演算子の仕組みと、具体的な使い方について分かりやすく解説します。
対象読者
- プログラミング初心者の方
- AndAlsoの仕組みや、普通の And との違いがあいまいな方
AndAlsoの仕組み(ショートサーキット評価とは?)
AndAlso は、複数の条件を「左から右へ」順番に評価し、結果が確定した時点でそれ以降の評価をスキップ(終了)する性質を持っています。
この仕組みをショートサーキット(短絡)評価と呼びます。
例えば、以下のように AndAlso が複数並んでいるケースを考えてみましょう。
If 条件A AndAlso 条件B AndAlso 条件C Then
' 処理
End If
このとき、プログラムは次のように動きます。
- まず、最初の条件である 条件A を評価します。
- もし条件Aが False(偽) だった場合、全体の判定結果が False になることがこの時点で確定します。
- そのため、後ろにある 条件B や 条件C は一切評価(実行)されず、そこで処理が終了 します。
普通の And と何が違うの?
普通の And 演算子は、たとえ条件Aが False であっても、後ろの条件Bや条件Cまで律儀にすべて評価します。
そのため、後ろの条件に「エラーの原因になるコード」が含まれていると、プログラムが強制終了してしまいます。
例文で学ぶ
もっとも分かりやすい例として、「オブジェクトが空(Nothing)ではないこと」かつ「そのオブジェクトのプロパティが特定の値であること」を判定するケースを見てみましょう。
❌ 悪い例(普通の And を使った場合)
Dim user As UserInfo = Nothing ' ユーザー情報が空の状態
' ⚠️ ここで NullReferenceException エラーが発生してプログラムが落ちます
If user IsNot Nothing And user.Name = "Alice" Then
Console.WriteLine("ユーザーはAliceです")
End If
- なぜ落ちるのか?: And はすべての条件を見るため、user が空であるにもかかわらず、後ろの user.Name を参照しようとしてエラーになります。
-
NullReferenceExceptionの発生 -
user(中身が空っぽの状態)に対して.Nameというデータを取り出そうとしたため、「存在しないものの身の回りを参照しようとした」としてNullReferenceException(ヌルリファレンス例外)が発生し、プログラムが停止します。 - Error発生場所:エラーが発生するのは
user.Name = "Alice"(And の後半部分)を実行しようとした瞬間
⭕ 良い例(AndAlso を使った場合)
Dim user As UserInfo = Nothing ' ユーザー情報が空の状態
' ✨ 安全に実行できます(エラーになりません)
If user IsNot Nothing AndAlso user.Name = "Alice" Then
Console.WriteLine("ユーザーはAliceです")
End If
- なぜ安全なのか?: 最初の条件
user IsNot Nothingが False になった瞬間、AndAlsoの仕組みによって処理が終了します。 - 後ろの
user.Nameは実行すらされないため、エラーを完全に回避できます。
他の言語やツールでの似たような処理・動作
AndAlso と同じ「ショートサーキット評価」の仕組みは、他の多くのプログラミング言語やデータベース、Excelなどにも存在します。
1. C# や JavaScript の && 演算子
多くの言語では、AndAlso の代わりに && という記号が全く同じ役割を果たします。
// JavaScriptの例:userがnull(空)の場合let user = null;
// userがnullなら最初の条件でFalseとなり、後ろの「user.name」は無視されます
if (user !== null && user.name === "Alice") {
console.log("ユーザーはAliceです");
}
2. Python の and 演算子
Pythonでは、記号ではなく and という文字を使いますが、仕組みは AndAlso と同じです。
Pythonの例:リスト(配列)が空の場合items = []
# リストが空なら最初の条件でFalseとなり、存在しない1番目を指すコード(items[0])はスキップされます
if len(items) > 0 and items[0] == "apple":
print("最初の要素はリンゴです")
3. SQL での代用(CASE 式)
データベースを操作するSQLには、AndAlso のような演算子は存在しません(評価順序はシステムに任されるため)。
しかし、CASE 式を使うことで、上から順番に評価させてエラーを防ぐ「同じ動き」を再現できます。
-- SQLの例:在庫数が0のときに、割り算(売上 ÷ 在庫数)によるゼロ除算エラーを防ぐSELECT 商品名FROM 在庫テーブルWHERE
CASE
WHEN 在庫数 > 0 THEN
CASE WHEN (当月売上 / 在庫数) > 10 THEN 1 ELSE 0 END
ELSE 0
END = 1;
4. Excel の IFS 関数(Office 2016以降)
Excelの IFS 関数も、左から順番に条件を評価し、一致した時点で処理を終えるショートサーキットのような動きをします。
=IFS(A1=0, "未入力", 100/A1>5, "高効率")
- A1セルが 0 の場合、最初の A1=0 で結果が確定するため、後ろの 100/A1(エラーになる計算)は無視され、画面に #DIV/0! エラーが出ません。
さいごに
AndAlso のようなショートサーキット評価は、エラー(例外)を防ぎながら安全にコードを書くための必須知識です。
- 複数の条件を並べるときは、「まず前提となる条件(Nullチェックや範囲チェック)」を左側に置く
- 基本的には And ではなく AndAlso を使った方が安全
VB.NETに限らず、他の言語やExcelなどでもこの考え方は共通しています。
この2点を意識するだけで、バグの少ない綺麗なコードが書けることにつながるかもしれません!!
