セージ の メモ書き

メモこそ命の恩人だ

C# - null 許容参照型

null 問題

アントニー・ホーア - Wikipedia

  • アントニー・ホーア氏が null 参照を発明。
  • 2009年のカンファレンスにて、null 参照を発明したことを謝罪。

それは10億ドルにも相当する私の誤りだ。null参照を発明したのは1965年のことだった。当時、私はオブジェクト指向言語 (ALGOL W) における参照のための包括的型システムを設計していた。目標は、コンパイラでの自動チェックで全ての参照が完全に安全であることを保証することだった。しかし、私は単にそれが容易だというだけで、無効な参照を含める誘惑に抵抗できなかった。これは、後に数え切れない過ち、脆弱性、システムクラッシュを引き起こし、過去40年間で10億ドル相当の苦痛と損害を引き起こしたとみられる。

null 安全

  • null 例外にならない仕組み。
  • 近年の言語は null 安全が考慮されている。

null 許容参照型

null 許容参照型 | Microsoft Docs

  • C# 8.0 以降で使用できる。
  • null 参照の例外を最小限に抑えることができる。
  • "NULL 許容" を "無効" にすれば、null を無効化できる。
  • ? で明示的に null 許容型にすれば、null を代入できる。
public class SampleClass
{
    public int Value { get; set; }
}
SampleClass sample;
// Debug.WriteLine(sample.Value);
// ビルドエラーになる。インスタンス生成していないため、検知してくれる。
SampleClass sample;
sample = new SampleClass();
Debug.WriteLine(sample.Value);
// インスタンス生成すれば、ビルドが通ることを確認。
SampleClass sample;
// SampleMethod(sample);
// ビルドエラーになる。インスタンス生成していないため、検知してくれる。

void SampleMethod(SampleClass sample) 
{
    Debug.WriteLine(sample.Value);
}

ただし、参照型の定義をネストすると、検知できなかった。
完全に null 安全というわけではなさそう...

public class SampleClass1
{
    public SampleClass2 sample2 { get; set; }
}
public class SampleClass2 { }
SampleClass1 sample1;
sample1 = new SampleClass1();
Debug.WriteLine(sample1.sample2.ToString());
// 例外発生:System.NullReferenceException: 'Object reference not set to an instance of an object.'

// プロパティは宣言時に初期化した方が安全。



以上