【入門編】VB.NETにおけるNull条件演算子(?.)とNull合体演算子(??)の現場活用:多重If文を一掃しNullReferenceExceptionをスマートに根絶する最新記法 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク
スポンサーリンク

Nullの恐怖を、エレガントな一行へ。VB.NETで「NullReferenceException」を根絶するモダンな設計術

プログラミングの世界へようこそ。あなたがマクロの記録から一歩踏み出し、本格的なアプリケーション開発(VB.NET)の門を叩いたことを、心から歓迎します。

開発を進めていると、必ずと言っていいほど遭遇する「悪魔」がいます。それは、`NullReferenceException`(オブジェクト参照がオブジェクト インスタンスに設定されていません)というエラーです。

「さっきまで動いていたのに、なぜか急に止まる」「データが入っているはずなのに落ちる」……。このエラーは、プログラムが「存在しないもの(Nothing)」に触れようとした時に発生する、いわば「幽霊を掴もうとした」状態です。

今日は、この幽霊(Null)をスマートに、そして美しく退治するための武器――「Null条件演算子(?.)」と「Null合体演算子(If関数)」の使い方を伝授します。これをマスターすれば、あなたのコードは劇的にスリムになり、プロフェッショナルな風格を纏うことになりますよ。

1. 「If文のピラミッド」という名の迷宮

まずは、多くの初学者が陥りがちな「古い書き方」を見てみましょう。
例えば、ある顧客情報のオブジェクトから「住所の市区町村名」を取り出したい場面を想定してください。

【Before】ネスト(階層)が深すぎる、読みづらいコード

“`vb.net
‘ 顧客データ、住所、市区町村という階層構造があるとします
Dim customer As Customer = GetCustomerFromDatabase()
Dim cityName As String = “”

‘ もし顧客が存在するか?
If customer IsNot Nothing Then
‘ もし住所データが存在するか?
If customer.Address IsNot Nothing Then
‘ もし市区町村名が設定されているか?
If customer.Address.CityName IsNot Nothing Then
‘ ここでようやく値が取れる!
cityName = customer.Address.CityName
Else
cityName = “住所未登録”
End If
Else
cityName = “住所未登録”
End If
Else
cityName = “顧客未登録”
End If

Console.WriteLine(“市区町村: ” & cityName)

### 何が問題なのか?

このコードを見て、どう感じますか? 「あぁ、なんだか右側にどんどんズレていって、読みづらいな」と感じたなら、あなたの感覚は正しいです。これをエンジニア用語で「ピラミッド・オブ・ドゥーム(破滅のピラミッド)」と呼んだりします。

1.  可読性の低下: 本質的な処理(cityNameへの代入)が、大量の `If` 文の中に埋もれてしまっています。
2.  保守の困難さ: もし「都道府県」も取得したくなったら? さらに `If` が重なり、コードはさらに複雑になります。
3.  バグの温床: `If` の組み合わせが複雑になると、どれか一つの条件を書き漏らすだけで、再び `NullReferenceException` が牙を剥きます。

2. 救世主その1:Null条件演算子 `?.`

ここで登場するのが、Null条件演算子 `?.` です。 この演算子の役割は、一言で言えば「左側が Nothing(Null)だったら、そこで探索を中止して Nothing を返す」という、賢いショートカットです。

魔法の仕組みを図解すると:

通常、`customer.Address.CityName` と書くと、プログラムは「customerを調べろ」→「その中のAddressを調べろ」→「その中のCityNameを調べろ」と、順番に突っ走ります。もし途中で `Address` が `Nothing` だったら、その瞬間にプログラムはパニックを起こして停止します。 しかし、`customer?.Address?.CityName` と書くと…… 1. `customer` はあるか? $\rightarrow$ Yes 2. じゃあ `Address` はあるか? $\rightarrow$ No! 3. 「あ、Addressがないから、これ以上先(CityName)は見に行かないよ。結果は Nothing で返しておくね」 $\rightarrow$ 安全に停止

3. 救世主その2:Null合体演算子 `If(a, b)`

`?.` を使うと、値が取れなかった時に `Nothing` が返ってきます。しかし、業務アプリでは「Nothing(空っぽ)」のままではなく、「未登録」といったデフォルトの値を表示したいことがほとんどですよね。 そこで使うのが、VB.NETにおけるNull合体演算子(`If` 演算子)です。 ※C#では `??` と書きますが、VB.NETでは `If(値, デフォルト値)` という非常に直感的な書き方をします。

4. 【実践】劇的なビフォーアフター

では、先ほどの「ピラミッド・オブ・ドゥーム」を、最新の記法で書き換えてみましょう。

【After】たった1行で完結する、エレガントなコード vb.net

‘ 顧客データを取得
Dim customer As Customer = GetCustomerFromDatabase()

‘ 【極限の知見】
‘ 1. ?. を使って、途中のオブジェクトが Nothing でもエラーにならないようにする
‘ 2. If(…, “デフォルト値”) を使って、最終的な結果が Nothing だった場合の代替値を決める
Dim cityName As String = If(customer?.Address?.CityName, “住所未登録”)

Console.WriteLine(“市区町村: ” & cityName)
“`

何が起きたのか?解説します

この一行は、内部で以下のロジックを完璧に実行しています。

1. `customer` が `Nothing` なら、即座に `Nothing` を確定。
2. `customer` はあるが、`Address` が `Nothing` なら、即座に `Nothing` を確定。
3. 最後まで辿り着いて `CityName` が `Nothing` なら、`Nothing` を確定。
4. 最終的な結果が `Nothing` になった場合、`If` 関数がそれを検知して `”住所未登録”` を代入する。

どうですか? 30行近くあった複雑な分岐が、たったの1行になりました。
コードが短くなっただけでなく、「何がしたいのか(住所名を取り出し、なければ未登録と出す)」という意図が、一目で読み手に伝わるようになっています。

5. プロの視点:使いどころと注意点

ここまで読んで「全部 `?.` で書けばいいじゃないか!」と思ったあなた。素晴らしい意欲です。しかし、伝説的なアーキテクトは、あえて「使わない時」を知っています。

⚠️ 注意すべきポイント

1. 「なぜ Nothing なのか」を調査すべき場面では使わない
本来、データが `Nothing` であることが「あり得ないはずの異常事態」である場合、`?.` で黙って回避してしまうと、バグの発見が遅れます。その場合は、あえて `If customer Is Nothing Then Throw New Exception(…)` のように、エラーを検知させる設計にすべきです。
2. 複雑すぎる連鎖は避ける
`a?.b?.c?.d?.e?.f` のように、あまりにも長く繋げすぎると、結局「どこでデータが途切れたのか」が分かりにくくなります。3〜4階層程度に留めるのが、美しい設計の境界線です。

まとめ:ここをクリアすれば、VB.NETの基本はバッチリです

  • `NullReferenceException` は、存在しないものに触れることで起きる。
  • `?.` (Null条件演算子) は、途中で Nothing が見つかったら安全に探索を止める。
  • `If(a, b)` (Null合体演算子) は、結果が Nothing だった時の「予備」を用意する。

この2つの武器を組み合わせることで、あなたのコードは「壊れにくく、読みやすい」ものへと進化します。

プログラミングは、単に命令を並べる作業ではありません。「いかに美しく、安全な論理を組み立てるか」という芸術です。今日学んだテクニックを、ぜひ明日からの開発現場で使ってみてください。

応援していますよ。次はもっと深い設計の概念について、お話ししましょう。

タイトルとURLをコピーしました