C#のnullとNullable型とは?初心者向けにnull許容型の基本と使い方を徹底解説!
生徒
「C#で変数に値が入っていないことを表す方法ってありますか?」
先生
「はい、C#ではnullを使って『まだ値がない』という状態を表せますよ。」
生徒
「でも、int型とかにはnullを入れられないんですよね?」
先生
「その通りです。ですが、Nullable型を使えばintなどの数値型でもnullを使えるようになりますよ!」
1. C#のnullとは?
null(ヌル)とは、「何も値が設定されていない」という状態を表す特別な値です。C#では、参照型(クラスなど)の変数に値を入れないと、自動的にnullになります。
たとえば、人の名前を格納する変数を考えてみましょう。まだ名前がわからないときには、空欄(null)のままにしておきたいですよね?それをプログラム上で表現するのがnullです。
string name = null;
このように書くことで、「nameにはまだ何も入っていません」とC#に伝えることができます。
2. 値型はnullを使えない?
ここで重要なポイントがあります。C#には大きく分けて「参照型」と「値型」の2種類のデータ型があります。
- 参照型:stringや配列、クラスなど
- 値型:int(整数)、double(小数)、bool(真偽)など
参照型はnullを使えますが、値型はそのままではnullを代入できません。これは、int型などは常に値を持つ必要がある設計だからです。
int number = null; // エラーになります!
このままでは、まだ決まっていない年齢やスコアなどを表現できなくて不便ですよね。そこで登場するのが「null許容型(Nullable型)」です!
3. Nullable型(null許容型)とは?
Nullable型とは、通常の値型に「nullを入れられるようにする仕組み」です。C#では、?を使って簡単にNullable型を作ることができます。
int? age = null;
このように書くと、「年齢がまだ未定」という状態をプログラムで表すことができます。
このint?のような書き方は、正式にはNullable<int>という書き方と同じ意味です。
Nullable<int> age = null; // これでもOK
でも、int?の方が短くて読みやすいので、現代のC#プログラミングでは主にこちらが使われます。
4. Nullable型の値を使うときの注意点
Nullable型の変数を使うときには、「本当に中に値が入っているかどうか」を確認する必要があります。もし値が入っていない状態(null)のまま使おうとすると、エラーになります。
int? score = null;
Console.WriteLine(score.Value); // これは例外(エラー)が発生します!
このようなときは、HasValueというプロパティで値が入っているかどうかをチェックできます。
int? score = 80;
if (score.HasValue)
{
Console.WriteLine("点数は " + score.Value + " 点です。");
}
else
{
Console.WriteLine("点数はまだ未定です。");
}
点数は 80 点です。
5. null合体演算子(??)を使ってみよう
Nullable型を使うときによく登場するのが??(null合体演算子)です。これは「もしnullだったら、代わりの値を使う」という処理を簡単に書ける便利な記号です。
int? age = null;
int displayAge = age ?? 20; // ageがnullなら20を使う
Console.WriteLine("表示する年齢:" + displayAge);
表示する年齢:20
このように書くと、変数がnullでも安全にプログラムを動かすことができます。
6. nullとNullable型の活用例
現実のアプリでは、まだ入力されていないデータや未決定な値を扱うことがよくあります。たとえば、次のような例が考えられます。
- ユーザーがまだ年齢を入力していない →
int?を使ってnullで初期化 - 商品のレビューがまだ付いていない →
double?で平均評価をnullに - オプションの電話番号 →
string?でnullを許容
int? userAge = null;
if (!userAge.HasValue)
{
Console.WriteLine("年齢が未入力です。");
}
年齢が未入力です。
このように、nullとNullable型は、柔軟なプログラムを作るうえでとても大切なしくみです。
まとめ
C#でプログラムを作成していく中で避けて通れない存在がnullとNullable型の概念です。とくにデータが未入力や値が未定といった状況は、現実世界のアプリケーションでは頻繁に起こるため、それらを正しく扱うための知識は欠かせません。
nullは「何もない」という状態を表す特別な値で、参照型の変数にだけ許されているものでしたが、値型(intやdoubleなど)でもnullを使えるようにするためにNullable型(null許容型)が用意されています。
Nullable型の基本的な記述はint?のように?を型のあとにつけるだけなので、初心者でも簡単に導入できます。ただし、nullかどうかを確認せずに値を使おうとするとエラーになることがあるため、HasValueや??(null合体演算子)などを使った安全なアクセス方法を覚えておくことが大切です。
以下のコードは、ユーザーの年齢を入力されるまでnullで保持し、入力されている場合のみ表示するサンプルです。
using System;
class Program
{
static void Main()
{
int? age = null;
Console.Write("年齢を入力してください(空欄なら未入力として扱います):");
string input = Console.ReadLine();
if (!string.IsNullOrEmpty(input))
{
age = int.Parse(input);
}
if (age.HasValue)
{
Console.WriteLine("入力された年齢は " + age.Value + " 歳です。");
}
else
{
Console.WriteLine("年齢は未入力です。");
}
}
}
このように、nullとNullable型を正しく理解することで、現実の不確定なデータを柔軟に扱えるようになります。C#ではとくにフォーム入力やデータベース連携の際に頻出する考え方なので、「nullを安全に扱うコードを書く習慣」を早い段階で身につけておくと良いでしょう。
生徒
「今日、nullとNullable型について初めてちゃんと学びました!nullって単に“空”って意味かと思ってたけど、扱いを間違えると危ないんですね。」
先生
「その通りです。特にC#では、nullを含む変数を扱う際にはHasValueでチェックしたり、??で代わりの値を用意したりする工夫が大切になります。」
生徒
「たとえばint型には普通nullを入れられないけど、int?って書くと許されるっていうのは驚きでした。書き方も覚えやすいし、今後よく使いそうです。」
先生
「いい気づきですね。現実のアプリでは“まだ決まっていない値”を扱う場面がたくさんあります。そんなときにNullable型が役立つんです。」
生徒
「HasValueでチェックしてからValueを使う…この流れ、しっかり覚えておきます!あと、??演算子はコードを短くできて便利ですね!」
先生
「その調子です。今回学んだnullとNullable型の知識は、今後のC#開発にきっと大きく役立ちますよ。」