2014/03/29

【C#】Null判定をよりスマートに(三項演算子やnull合体演算子、Null許容型)

プログラミングをしているときによく目にする「NullReferenceException」
Javaでいうところの「ぬるぽ(NullPointerException)」「ガッ」

なんも入っとらんのに、何参照しとんねん!! ってやつ。


だから、そのオブジェクトを参照する前に本当に参照してよいかを判定しれやれば良い。

例として「value1」と「value2」を使ってまとめていく。
※stringは参照型のため、Nullのままvalue1.Lengthなんて参照するとNullReferenceExceptionになる。

string value1 = null;
string value2 = "abc";






if文による一般的なNull判定


if (value1 == null)
{
    Console.WriteLine("Null");
}
else
{
    Console.WriteLine(value1);
}

ごくごく普通なNull判定。
ただ、この処理がいっぱいあったらソースの可読性が著しく低下する。

「value1 == null」が代入式に見えるからという理由で「null == value1」と書く人もいるけど、特に気にしない。



?演算子(三項演算子)によるNull判定



// Null
Console.WriteLine(value1 == null ? "Null" : value1);
// abc
Console.WriteLine(value2 == null ? "Null" : value2);

「条件式 ? 真のときの値 : 負のときの値」と表す。

中には三項演算子が読みにくいと嫌う人もいるみたいで、プロジェクトのコーディング規約に準拠したほうが無難。
個人的には無駄な変数を用意しなくて済むし、なんたって1行でかけるのが読みやすくよく使っている。




??演算子(null合体演算子)によるNull判定



// Null
Console.WriteLine(value1 ?? "Null");
// abc
Console.WriteLine(value2 ?? "Null");

?演算子よりもっとスリムになったのが??演算子!

「value1」がNullじゃなければ「value1」、Nullだったら「"Null"」を返す。
「value1 == null ?  “Null” : value1」と同じ意味。

表記は「null合体演算子」を推したい。「??」じゃググれないからね。




おまけ(Nullable型(Null許容型)とNull判定)


数値型でもNullを許容することができる。

int? number = null;

if (number.HasValue)
{
    Console.WriteLine("NotNull");
}
else
{
    Console.WriteLine("Null");
}

「int?」の「?」がNullを許容しますよという印。
もちろん「double?」や「decimal?」でもOK

そして、Null許容にすることで「HasValue」を使うことができる。






参考



以上

0 件のコメント :

コメントを投稿