C#のnull合体演算子(??)の使い方!デフォルト値を設定する便利技
生徒
「C#で、変数がnullだった場合に別の値を使いたいときって、どう書けばいいんですか?」
先生
「そういうときには、??(null合体演算子)を使うと便利ですよ。」
生徒
「null合体演算子ってなんですか?聞いたことがありません…」
先生
「それでは、null合体演算子が何か、そしてどんな場面で使うのかをわかりやすく説明していきましょう。」
1. null合体演算子(??)とは?
C#のnull合体演算子(??)は、変数がnullかどうかを判定し、nullなら別の値を使うというとても便利な書き方です。
「null(ヌル)」とは、何も値が入っていない状態のことを指します。たとえば、箱(変数)が空っぽのときに、代わりのもの(デフォルト値)を使いたい場面がありますよね。
そんなときに活躍するのが、この??という記号です。
2. null合体演算子の基本構文
基本的な使い方はとてもシンプルです。
string name = null;
string displayName = name ?? "名無しのユーザー";
Console.WriteLine(displayName);
このコードの意味は、「nameがnullなら、displayNameには”名無しのユーザー”を入れてね」ということです。
名無しのユーザー
もしnameに何か値が入っていれば、その値がそのままdisplayNameに入ります。
3. null合体演算子を使わない場合の面倒な書き方
??を使わないと、同じ処理でも以下のように少し長くなってしまいます。
string name = null;
string displayName;
if (name != null)
{
displayName = name;
}
else
{
displayName = "名無しのユーザー";
}
Console.WriteLine(displayName);
これを??を使えば、たった1行で書けるので、コードもスッキリして読みやすくなります。
4. 数値やbool型でも使える
null合体演算子は、文字列だけでなく、int型やbool型など他の値型(value type)でも使えます。
ただし、int型やbool型は通常nullを入れることができません。そのため、「nullable型」(ヌラブルがた)として使う必要があります。
nullable型とは、int?やbool?のように、「?」をつけてnullを許容できる型です。
int? number = null;
int result = number ?? 0;
Console.WriteLine(result);
0
この例では、numberがnullなので、resultには0が入ります。
5. null合体演算子を使った実用的な例
たとえば、ユーザーから名前を入力してもらうとき、空だったら「ゲスト」と表示したい場合はこう書けます。
Console.WriteLine("あなたの名前を入力してください:");
string input = Console.ReadLine();
string userName = input ?? "ゲスト";
Console.WriteLine("ようこそ、" + userName + "さん!");
Console.ReadLine()は、何も入力されないとnullになる場合があるため、null合体演算子でフォローすることで、安全にデフォルト値を設定できます。
6. null合体演算子とnull条件演算子の違い
似た名前で混乱しやすいのが、null条件演算子(?.)です。
これは、オブジェクトがnullかどうかを調べて、安全にプロパティなどへアクセスするための演算子です。
一方、??は、「nullだったときに代わりの値を使う」ための演算子です。目的が異なるので、混同しないようにしましょう。
7. null合体演算子は省略の美学
プログラムを書くときは、できるだけ短く・読みやすく・安全に書くのが理想です。
if文で長々と書かなくても、null合体演算子を使えば、1行でnullチェックとデフォルト値の代入が同時にできるので非常に便利です。
初めてプログラミングを学ぶ方にとっても、読みやすいコードが書けるようになる第一歩として、??の使い方をぜひ覚えておきましょう!
まとめ
C#でプログラムを書くとき、「この変数は中身があるかな?」「もし空っぽだったら別の値を使いたいな」という場面は意外と多いものです。特にユーザー入力や外部データを扱うと、nullが入ってしまうことは珍しくありません。そこで役立つのが、このページで学んだnull合体演算子(??)という便利な文法です。null合体演算子は、変数がnullならデフォルト値、nullでなければそのままの値を使えます。たった二文字の記号で、読みやすく、スッキリしたコードに変わるため、初心者から上級者まで幅広く使われています。
もしnull合体演算子を使わない場合は、if (変数 != null)のようなチェックを書き、elseで別の値を設定しなければいけません。これではコードが長くなり、同じような条件が増えるにつれ、見通しが悪くなってしまいます。こうした冗長な処理を省き、ひと目で「nullだったらこの値を使うんだな」と読み取れるのがnull合体演算子の強みです。C#でよく使われる基本構文のひとつですから、普段から意識して書いてみると、自然に身に付いていきます。
文字列に使う例
たとえばユーザー名が取得できなかったとき、自動的に「ゲスト」扱いにできます。
string name = null;
string userName = name ?? "ゲスト";
Console.WriteLine("ようこそ " + userName + " さん");
もしnameに値が入っていればそのままuserNameになりますし、nullであれば「ゲスト」が設定されます。このように、プログラム側で安全なデフォルト値を準備しておくことで、急なエラーや想定外の動作を防ぐことができます。
数値やboolにも使える例
null合体演算子は文字列だけでなく、intやboolといった値型でも活躍します。ただし、値型はそのままではnullを入れられないため、nullable型にして扱います。
int? point = null;
int total = point ?? 0;
Console.WriteLine("合計ポイントは " + total + " です");
pointがnullなら0、値が入っていればその数が使われます。if文を書かなくても成立するので、初心者にも理解しやすく、読みやすい構造になります。
null条件演算子との違い
よく似ている演算子に?.という記号があります。こちらは「オブジェクトがnullじゃなければプロパティにアクセスする」という意味を持ちます。null合体演算子は「nullならデフォルトを付ける」、null条件演算子は「nullなら先に進まず止まる」。目的が違うため、使い方も異なります。どちらも安全にプログラムを動かすために重要な存在なので、少しずつ違いを覚えていくと良いでしょう。
実用的な例:画面入力や外部データで活躍
実際のアプリケーションで一番出番が多いのは、ユーザー入力やファイル、データベースからの読み込みです。外部から取り込むデータは、必ずしも期待通りの値が入ってくるとは限りません。そのため、初期値や代替値を用意しておくと、予期しない停止や例外を回避できます。
Console.WriteLine("好きな色を入力してください:");
string input = Console.ReadLine();
string color = input ?? "未設定";
Console.WriteLine("あなたの選んだ色:" + color);
入力が空だった場合にも、「未設定」と表示できるため、アプリが無言のまま止まることを防ぎます。こうした細かい積み重ねで、ユーザーにとって使いやすいプログラムに育っていきます。
条件が増えても読みやすさを保てる
プログラムは規模が大きくなるほど、条件分岐が増えます。同じようなif文ばかりが並ぶと、どこが重要なのか分かりづらくなります。null合体演算子を使えば、値の確認と代入が同時にできるので、横に広がりやすいコードを短くまとめられます。読みやすさが保たれることで、修正や追加も簡単にできます。
よくある間違い
null合体演算子は便利ですが、値型を扱うときにはnullable型にしないと使えません。たとえばint result = number ?? 0;とすると、numberがnullを受け取れないのでエラーになります。また、??の前後に値を付け忘れたり、「nullかどうか判定しているつもりで違う処理を書いていた」というケースもあります。丁寧にチェックしながら書けば問題ありませんが、慣れるまでは一行ずつ確認してみるとよいでしょう。
プログラムの見た目を整える小さな工夫
コードは自分が書くだけのものではありません。他の人が読むかもしれないし、数ヶ月後の自分が読み返すかもしれません。そのとき、if (x == null)が何度も並ぶより、x ?? "〇〇"と書かれているほうが意図が伝わりやすくなります。短い記述で意味を明確にできるのは、プログラミングにおいて大きな強みです。
総合的な振り返り
null合体演算子は、C#のコードを短くまとめる便利な道具であり、プログラムの品質を上げる小さな工夫でもあります。初心者にもわかりやすい書き方なので、今日学んだ内容を実際のコードに組み込んでみると、違いが実感できるはずです。if文を長く書かなくても済む、読み手に優しいコードが書ける、nullによるエラーを防げるという三つの利点を意識しながら、ぜひ習慣にしていきましょう。
生徒
「null合体演算子って、こんなに便利だとは知りませんでした!」
先生
「ちょっとしたところで使えるから、小さな条件をきれいに整理できますよ。」
生徒
「if文を減らせるだけでも、見た目がすごくスッキリしますね。」
先生
「そうなんです。読みやすいコードは、バグも少なくなるんです。次は値型のnullableも活用してみましょう。」
生徒
「はい、いろいろ試してみます!入力が空でも動くようにできるのは嬉しいですね。」
先生
「その意識が大事です。安心して動くプログラムを書くほど、自信もついてきますよ。」