C# ??演算子(Null合体演算子) の紹介

.NET 2.0 で導入されたけど、あんまり有名じゃない気がする。個人的には結構好き。
多分、Nullable な型が出来たから追加されたんだろうなと思う。


どんな演算子かというと、

z = x ?? y; // x が null の場合、y が代入される。

三項演算子でも書けるけど

z = x == null ? x : y;

Nullable な型を使ってる時に良く使ってる。

こんな感じ。

int? hoge;
〜
int hage = hoge ?? 0;

これを別の書き方をすると

int hage = hoge.HasValue ? hoge.Value : 0;

int hage = hoge.GetValueOrDefault(0);

GetValueOrDefault って長くてメンドクサイので、ついつい ?? 演算子を使ってしまう。
でも、式の途中で使うと不用意に使うとハマってしまう。
CsharpConsole で実際に試してみる。
http://dl.getdropbox.com/u/152061/blog/20090522/csharpconsole.png
最後の乗算の部分だけど、演算子の優先順位によって思ってもない結果になってる。


?? 演算子は、代入なので優先順位は低い。MSDN C#の 演算子
そのため、

int y = hoge ?? 0 * 4;

は、まず 0 * 4 が計算されて

int y = hoge ?? 0

になって、結局 y の値は、hoge か hoge が null の場合は、0 になる。

y = (hoge ?? 0) * 4;

は、まず hoge ?? 0 が解決されて、今回の場合 hoge は 3 なので

y = 3 * 4;

になって y は 12 になる。


結構注意が必要!!やっぱり、使わない方がいいのかな?