息抜き C# ~ New Normal なコードの書き方:第04回「null許容参照型」 ~

f:id:ecb_smiyahara:20220216092822j:plain

こんにちはecbeingでアーキテクトをやっている宮原です。

New Normal なコードの書き方 の第04回目、今日は「null許容参照型」について説明いたします。


本記事は 息抜きC# 記事の第04回目です。
第03回目「型Switch」はこちら。

null許容型

さて、「null許容参照型」を説明する前に「null許容型」のおさらいをしておきたいと思います。

値型である int や bool は null を代入できませんが、後ろに「?」をつけると「nullを代入できる値型」を表現することが出来ます。

int i1;     // int型
i1 = 0;     // 整数は代入できる
i1 = null;  // nullは代入できない(コンパイルエラー)

int? i2;    // int の null許容型
i2 = 0;     // 整数は代入できる
i2 = null;  // nullも代入できる

このように型の最後に「?」を付けた型は、その元の型の「null許容型」であるということを表し、元になった型に代入可能な全ての値に加え、nullが代入可能となります。

null許容参照型

では「null許容参照型」とは何でしょうか?


値型と違い、そもそもC#内でもnullの代入が認めらている参照型が「null許容」されるとは一体どういうことなのか?
と思った方も多いかもしれません。


しかしその、『nullの代入が認めらている参照型』という前提が現在崩れつつあると言ったら、驚かれるでしょうか?

近年、Kotlin、Swift、Rustなどの新しい言語ではnullの無制限な利用が認められなくなってきています。
これはアントニー・ホーアの2009年の有名なスピーチ「Null References: The Billion Dollar Mistake*1」でも多くに知られるようになった、「nullの濫用はバグの温床である」という認識が広まったことによるものです。


マイクロソフトもこれにならい、C#8.0以降のプロジェクトには「Null許容*2」という設定が追加されています。
f:id:ecb_smiyahara:20220216112847p:plain

この設定を有効化したプロジェクト*3内では参照型にnullを代入しようとすると警告が発生するようになります。

警告が出るだけなのでビルドも実行も可能なのですが、Visual Studioには警告をエラーとして扱う設定もある通り、警告を放置することは望ましくありません。


そこで出てくるのが「null許容参照型」となります。

string s1;    // 文字列型
s1 = "hoge";  // 文字列は代入できる
s1 = null;    // 「Null許容」が有効化されたプロジェクトでは警告が出る

string? s2;   // 文字列型 の null許容参照型
s2 = "hoge";  // 文字列は代入できる
s2 = null;    // 警告も出ない


要するに「null許容参照型」とは

「Null許容」が「有効化」に設定されたプロジェクト内で、参照型変数のnull代入可能・不可能をプログラマーが明示的に指定するための型

ということになります。

null許容

ちなみにですが「null許容参照型」が出来たことで、かつての「null許容型」は「null許容型」として再命名されました。
今後は「null許容型」は「null許容参照型/null許容値型」をまとめて指す名称として使われていく事になると思われます。

まとめ

「null許容参照型」とは、言葉だけ見ますと新たな型が追加されただけのように思えますが、実際には近年の「Null安全」という潮流におけるC#の取り組みの一貫と言える機能なのです。


第05回目「Hello World!」はこちら。

ecbeingでは新しい潮流に乗りたいエンジニアを募集しています!!

careers.ecbeing.tech

*1:www.infoq.com

*2:ところでこの「Null許容」という設定項目名は「Null安全」とかもう少しわかりやすい名前に変わらないものでしょうか・・・?

*3:C#10.0以降はデフォルトで「有効化」されています