【技術者ブログ】C#8.0で参照型のNULLはどうなるの?

▽執筆した社員
佐々木:The職人。頼れるシニアプログラマー
■Nullというお化け
毎日死ぬほど暑いですね。
そんな時、最もダルい気持ちになるのが、System.NullReferenceException が出て、後からコードに Null チェックを入れることです。
string s1;
int len=s1.Length;
さすがにこれは「未割り当てのローカル変数’s1’が使用されました」とビルドが通りません。ですが、
string s1=Request.QueryString[“s1”];
int len=s1.Length;
となると、s1の値は Request.QueryString[“s1”] にゆだねられるので、ビルドは通り、 null が代入された時にLengthが実行時エラーになります。
そもそも文字の長さは、文字が空文字でも null でも、 0 を返していただいて一向に構わなかったりします。
細かいことは拘りません。
s1 に付いてくる便利メンバーである s1.Lengthを 使ったばっかりに、 s1 が null の時に System.NullReferenceException が出て Length が共倒れしてしまうのです。
この解決を考えると、この方法が思いつきます。
int len= 0;
if(s1 != null) len=s1.Length;
これを三項演算子にして、
int len= s1 != null ? s1.Length : 0;
問題は、毎回書くのが冗長である、本音では、めんどくさ過ぎる!!という一点にあります。
せめて、値の代入時点に Null をチェックした方が、回数は減りそうだなと思えます。
string s1=””;
if(Request.QueryString[“s1”]!=null) s1=Request.QueryString[“s1”];
int len=s1.Length;//←チェックしない
こういう時のためにNULL合体演算子があるので、実際は、
string s1 = Request.QueryString[“s1”] ?? “”;
でしょうか。
■C# を作っている人達が今考えていることは
 string s1=Request.QueryString[“s1”];
で、 null が入ってきたら実行時エラーになるstring型になれば、やや便利なんじゃないか?ということのようです。
null が入り得る時に警告を出してやれば、チェック忘れも減るかもしれません。
C# は最初、値型は null になり得ませんでした。
例えばbool型は true か false のみで、
bool b1; は既定値の false で初期化されます。
ただ、現実には、値が設定されていない状態を表現したいわけで、 false なのはおかしいんじゃないか?
ということで考え出されたのがNull許容型でした。
bool b1;
bool? b2;
b1はfalseですが、b2はnullですね。
同じように、
string s1;
string? s2;
がある場合、 s1 は空文字、 s2 が null になればいいのでは?
問題は、これまでの string はNull許容型なので、これをNull非許容に変えてしまうと、既存のプラグラムに壊滅的な影響をもたらしてしまうと思います。
逆に string? をNull非許容型にすると、互換性は問題ないのですが、既存のNull許容型と意味が逆になってしまいます。
今のところ、オプション設定で、 string をNull非許容、 string? をNull許容に出来るという、本来そうでありたい仕様にして、使うかどうかは「ユーザー任せ」にする意見が強そうだなと思っています。
【求人告知】スキルアップに燃える経験者からの応募お待ちしています!