【C#】NULL条件演算子について

し、し、知らなかった。

C#6.0以降、null条件演算子なるものがあったってことを・・・。

事の発端

github内のソースを見ていて、ふと目にとまったコードがありました。

  var str = val?.ToString();

こんな風に書かれている箇所がありまして。
これ、なんぞや?と思ってググってみたのです。

まぁ見た感じ、nullチェックなんじゃなかろーかと思って「C# nullチェック」と
検索窓に入れてみたのですよ。
そしたら、

f:id:s44511173:20190809151749p:plain

こーんなステキな検索候補が出てくるじゃありませんか!

NULL条件演算子

さっそく「C# nullチェック 演算子」でググッた結果の一番上の記事(安直w)をオープン!そこは私のバイブル「@IT」の記事でした。

www.atmarkit.co.jp

よーするに、オブジェクトのメソッドやフィールドにアクセスする際のnullチェックを、「オブジェクト名+?」で簡略化できるよってことらしいです。

今までの書き方@自分

自分、不器用なんで。
今まで、こんな風に書いてました。

  var str = val != null ? val.ToString() : null;

これでも間違いではないのです、古い書き方だけど。(三項演算子というらしい)
若かりしころ、こんなコードを書いちゃう自分カッコ良くね?
なんてコッパズカシイことを思っていたものです。
ほんとに若かりしころの話ね。ほんとにほんとね。

ところが@IT様の記事によると、これはスレッドセーフではないと。
val!=nullでnullチェックをした時にはOKだったかもしれないが、ToString()する時点でnullになっているかも知れないと。
そりゃそうだ。むしろとっとと気づけ自分。

それと比較して、null条件演算子はスレッドセーフであるため安全ですし、コードがかなり簡略化できるので非常に使い勝手が良いです。

結論

  • C#6.0以降、null条件演算子なるものが使えるようになった
  • null条件演算子はスレッドセーフ
  • 三項演算子はスレッドセーフではない
  • 常にスレッドセーフを考慮してコーディングしましょう@自分

 

 

↑↑↑ ぜひ遊んでみてください!↑↑↑