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を減らすための仕組みです。