zukucode
主にWEB関連の情報を技術メモとして発信しています。

C# nullable参照型でnullの可能性を表す

nullable参照型を有効にすると、参照型の値がnullになる可能性を型で表せます。

目的は、すべての場所へ?!を付けて警告を消すことではありません。値が存在しない状態を仕様として許すのか、それとも呼び出し側の誤りなのかを型に表し、必要な場所でだけnullを処理できるようにすることです。

stringとstring?の違い

string name = "山田";
string? nickname = null;

stringはnullにならない想定、string?はnullになる可能性がある型です。

警告になる例
Console.WriteLine(nickname.Length);

nicknameがnullかもしれないため、コンパイラーが警告します。

nullを確認する

if (nickname is not null)
{
    Console.WriteLine(nickname.Length);
}

nullではないことを確認した範囲では、安全にプロパティを使用できます。

?.と??を使用する

var length = nickname?.Length;
var displayName = nickname ?? "ニックネーム未設定";

?.は左側がnullならnullを返します。??は左側がnullなら右側の値を返します。

var message = $"表示名: {nickname?.Trim() ?? name}";

ニックネームがあれば前後の空白を除いて使用し、なければ名前を使用します。

引数でnullを受け付けるか表す

public static string FormatName(string name, string? nickname)
{
    return nickname is null ? name : $"{name} ({nickname})";
}

シグネチャを見るだけで、nameは必須、nicknameは任意だと分かります。

null免除演算子に注意する

var length = nickname!.Length;

!はnullチェックを行いません。コンパイラーの警告を消すだけなので、実際にnullなら実行時エラーになります。

値が必ず存在する根拠がある場合だけ使用します。通常はnullチェックや初期値の設定で対応します。

nullable参照型は、nullになる場所を明確にし、NullReferenceExceptionを減らすための仕組みです。


関連記事