0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【VB.NET】AndAlsoの仕組みとエラーを防ぐショートサーキット評価の基本

0
Posted at

はじめに

Gemini_Generated_Image_4lwgzr4lwgzr4lwg.png

プログラムを書いている際、
「条件分岐でなぜかエラー(NullReferenceExceptionなど)が発生して止まってしまう」という経験はありませんか?

それは、条件の判定方法である「ショートサーキット評価」を正しく活用できていないからかもしれません。
本記事では、VB.NETなどで使われる AndAlso 演算子の仕組みと、具体的な使い方について分かりやすく解説します。

対象読者

  • プログラミング初心者の方
  • AndAlsoの仕組みや、普通の And との違いがあいまいな方

AndAlsoの仕組み(ショートサーキット評価とは?)

AndAlso は、複数の条件を「左から右へ」順番に評価し、結果が確定した時点でそれ以降の評価をスキップ(終了)する性質を持っています。

この仕組みをショートサーキット(短絡)評価と呼びます。
例えば、以下のように AndAlso が複数並んでいるケースを考えてみましょう。

If 条件A AndAlso 条件B AndAlso 条件C Then
    ' 処理
End If

このとき、プログラムは次のように動きます。

  1. まず、最初の条件である 条件A を評価します。
  2. もし条件Aが False(偽) だった場合、全体の判定結果が False になることがこの時点で確定します。
  3. そのため、後ろにある 条件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の例:usernull(空)の場合let user = null;
// usernullなら最初の条件で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点を意識するだけで、バグの少ない綺麗なコードが書けることにつながるかもしれません!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?