こんにちは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」という設定が追加されています。
この設定を有効化したプロジェクト*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#の取り組みの一貫と言える機能なのです。
ecbeingでは新しい潮流に乗りたいエンジニアを募集しています!!