🐡

Null許容参照型

2023/02/07に公開
  1. Null許容参照型とは?
    Nullになり得る参照型のこと。
    Null許容参照型のオブジェクトに対してNullを代入しようとするとコンパイル警告になる。

  2. Null許容参照型の宣言方法

class Program
{
 static void Main(string[] args)
 {
  // null 許容参照型を宣言する場合は、型名の後に `?` を付ける
  string? name = null;
  // null 許容参照型のメンバーにアクセスしようとすると、コンパイル警告を出すことが可能。
  Console.WriteLine(name.Length);
 }
}
  1. Null許容値型との違い
    Null許容値型(Nulable型:int?やdecimal?など)との違いは、
    ・HasValueでNull判定ができない
    ・Valueで値にアクセスできない
    といった、Null許容値型が持っているメソッドをNull許容参照型は持っていないということ。
    Null許容参照型はあくまでも、Nullとなり得る可能性を宣言しているだけで、機能を持った独自の型というよりも、再代入不可を宣言するConstのようなイメージ。

4. 使い方 
Null許容参照型の導入は、行単位とプロジェクト単位の2つがある。

  • プロジェクト単位
    プロジェクトの.csprjファイル内に設定できる。
    指定できる値は指定できる値は enable(有効)、disable (無効)、warnings (警告のみ有効)、annotations (アノテーションのみ有効)の4種類がある。
<PropertyGroup>
    <Nullable>enable</Nullable>
</PropertyGroup>
  • 行単位
    ソースコードの行単位でNull許容参照型を有効にするかを設定できる。
public class Program
{
    static void Main()
    {
#nullable enable
        string name = null; // 警告が出る
 
#nullable disable
        name = null; // 警告が出ない
    }

5. メリット

  • NullReferenceExceptionを予防できる
    オブジェクトに対してNullの可能性の有無を事前に宣言することで、オブジェクトに対するNullチェックが出来ているのかをコンパイルの時点で発見できる。

6. デメリット
新規プロジェクトに導入するにあたってのデメリットは特にない。
既存プロジェクトへの導入は、警告が大量に発生する可能性があるため推奨されない。

7. ポイント

  • !演算子
    !演算子を使用すると、たとえNull許容参照型で宣言された場合でも、非Nullな参照型として扱える。
class Program
{
 void Main(string? a)
 {
  // aはstring?だけど、コンパイル警告に引っかからない。
  console.WriteLine(a!.Length)
 }
}

Discussion