🐡
Null許容参照型
-
Null許容参照型とは?
Nullになり得る参照型のこと。
Null許容参照型のオブジェクトに対してNullを代入しようとするとコンパイル警告になる。 -
Null許容参照型の宣言方法
class Program
{
static void Main(string[] args)
{
// null 許容参照型を宣言する場合は、型名の後に `?` を付ける
string? name = null;
// null 許容参照型のメンバーにアクセスしようとすると、コンパイル警告を出すことが可能。
Console.WriteLine(name.Length);
}
}
- 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