1
/
5

【技術者ブログ】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許容に出来るという、本来そうでありたい仕様にして、使うかどうかは「ユーザー任せ」にする意見が強そうだなと思っています。


【求人告知】スキルアップに燃える経験者からの応募お待ちしています!
https://d-nami.co.jp/recruit/

株式会社 D-ウェーブ's job postings

Weekly ranking

Show other rankings