null 非許容参照型 のコンパイル警告の対応

2025年7月6日 16時51分

null 許容参照型

参考
null 許容参照型
メモリとリソース管理 null 許容参照型

null 許容参照型 への対応

参考
Null 許容の警告を解決する手法を学ぶ
Null 許容参照型の使用

  • コンストラクタでの代入
public class Person
{
    public Person(string first, string last)
    {
        FirstName = first;
        LastName = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

  • 既定値が存在する場合は、プロパティ宣言時に既定値を代入
public class Person
{
    public string FirstName { get; set; } = "";
    public string LastName { get; set; } = "";
}

  • null があり得る場合は、Null 許容参照型に変更
public class Person
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
}

  • null 免除演算子を使用
public class Person
{
    public string FirstName { get; set; } = null!;
    public string LastName { get; set; } = null!;
}

  • default + null 免除演算子を使用
public class Person
{
    public string FirstName { get; set; } = default!;
    public string LastName { get; set; } = default!;
}
  • 基本的にはコンストラクタで明示的に代入するように実装すべき。
    オブジェクトの初期化時に必須プロパティの設定を強制できる。

  • とはいえ、業務アプリケーションでデータを格納するクラスのような場合では、必須(DB で not null)になる項目の値をすべて用意してからインスタンス生成、というのはあまり現実的ではない(気がする)。
    とりあえずインスタンス生成して、そのあとで必須・非必須のプロパティを設定していく、というコードになることが多い。なので、string 型のプロパティについては、宣言時に空文字("")を代入するコードスタイルもありかもしれない。(null がありえるプロパティであれば、もちろん「Null 許容参照型」にしなければならない)

  • そもそも int とか long の値型は普通に初期値 0 なわけで、string 型が参照型というのは歴史的?に仕方ないのかもしれないが、値型(初期値 : "")であって欲しかったと思うのは私だけでしょうか。

  • null 免除演算子の使いどころは、プロパティは必須だがクラスのインスタンス生成は外部のライブラリに依存する(自前で初期値を設定できない、DI で入ってくるとか)ケース。

  • default! と null! は事実上同じだが、プロパティの初期化には default! がよく使われている。