【C#】null 許容参照型(nullable reference types)の基本

C# 8.0 以降では「null 許容参照型(nullable reference types)」が導入されました。これにより、参照型に null が代入可能かどうかをコンパイラが区別して扱えるようになります。null による実行時エラー(NullReferenceException)を未然に防ぐための重要な仕組みです。本記事ではその基本的な使い方とポイントを解説します。

従来の参照型とnullの問題

C# 7 以前では、すべての参照型変数に null を代入できました。そのため、null チェックを怠ると実行時にエラーが発生します。

string message = null; // 代入可能
Console.WriteLine(message.Length); // 実行時エラー(NullReferenceException)

nullable reference typesの有効化

C# 8.0 以降では、プロジェクトやファイル単位で nullable を有効化できます。

<PropertyGroup>
  <Nullable>enable</Nullable>
</PropertyGroup>

または、ソースコード内で明示的に指定することも可能です。

#nullable enable

null許容参照型の宣言

nullable を有効にすると、通常の参照型は「null を許容しない」と解釈されます。null を代入可能にしたい場合は ? を付けて宣言します。

string notNull = "Hello";     // null 不可
string? canBeNull = null;     // null 可

notNull = null; // コンパイル警告
canBeNull = "World"; // OK

nullチェックの強化

null 許容参照型では、コンパイラが null の可能性を警告してくれるため、安全なコードを書くことができます。

void PrintLength(string? text)
{
    Console.WriteLine(text.Length); // 警告: null の可能性あり
}

null チェックを入れると警告が解消されます。

void PrintLength(string? text)
{
    if (text != null)
    {
        Console.WriteLine(text.Length); // 安全
    }
}

null許容演算子(!)

コンパイラに「ここでは null にならない」と明示するには「null 許容抑制演算子(!)」を使います。

string? name = GetName();
Console.WriteLine(name!.Length); // null ではないと保証する

ただし実際に null が入っていると実行時にエラーになるため、使いすぎには注意が必要です。

まとめ

null 許容参照型は C# 8 以降で利用可能な、null 安全性を高める機能です。

  • string は null 不可、string? は null 可
  • nullable を有効にするとコンパイラが null の可能性を警告
  • ! 演算子で「null ではない」と明示できるが使いすぎ注意

null による不具合を未然に防ぐため、C# 8 以降では nullable を有効にして開発するのが推奨されます。