C# の null 安全

null 安全

C# には 8.0 から null 安全のための機能として null 許容参照型が導入されています。 null 許容参照型を利用することで C# で記述するプログラムの null 安全を実現することが出来ます。 C# 言語のバージョンを 8.0 異常にする必要があるため、.NET Core の 3.x 以上にする必要があります。

設定の有効化

Visula Studio を利用している場合はプロジェクトのプロパティから『Null 許容』を『有効化』に設定します。

この設定だけでは警告として扱われるため、必要であれば『警告をエラーとして扱う』を有効化します。

null 許容参照型

『Null 許容』の設定を有効化すると null 許容を指定していない参照型の変数に null を代入できなくなります。 参照型の変数に null を代入する必要がある場合は null 許容参照型として明示する必要があります。 null 許容参照型の記述方法は null 許容値型と同じ様に型名の後ろに ? を付けます。

// この変数は null 許容参照型になっていないため、コンパイル時に警告が出ます
Form form1 = null;

// この変数は null 許容参照型になっているため、コンパイル時に警告は出ません
Form? form2 = null;

『Null 許容』の設定を有効化し null の可能性がある変数を型で明示することによって、NullReferenceException が発生しないことをコンパイル時に検出することが出来ます。

null を許容しない変数への代入

null を許容しない変数に代入する際には事前に null チェックを行うか、null 合体演算子 (??) を利用してデフォルト値を指定する必要があります。

Form? f = null;

if (f != null)
{
    // このスコープでは f に対する null チェックが実行され f が null でないことが保証されているため、null を許容しない変数への代入が可能です。
    Form f1 = f;
}

// null 合体演算子 (??) を利用することで f2 には f が null でない場合には f が、f が null の場合には new Form() が代入されます。
Form f2 = f ?? new Form();

// フロー解析の結果、null でないことが保証されている場合にも null を許容しない変数への代入が可能です。
f = new Form();
Form f3 = f;

参考資料