#2 - unityでnullチェックを簡単にするc#の書き方 | 駆け出しゲームプログラマーの備忘録

最近納期に追われて全然書く時間が取れなかったので久しぶりに


C#には「null条件演算子」「null合体演算子」というめっちゃ便利なnullチェックできるものがあります

■null条件演算子( ?. )

string name = this.player.name;

このコード、もし this.player が null だったとしたらエラーが出て止まってしまいます
そんな時に使えるのが null条件演算子 です

・null条件演算子の例

string name = this.player?.name;

this.playerの横に「?」がつきました
これは this.player が null だった場合はそれより右の変数、関数は呼び出さずに null を返却するものです

これが null条件演算子 と言われているもので、処理的には

if( this.player == null )
{
    name = null;
}
else
{
    name = this.player.name;
}

と同じことをしています
ただ、 null条件演算子を使用できない場面もあり例えば

int hp = this.player?.hp;

これなんかだと int型は null を許容していないのでエラーになります
これだけ見ると null許容している型しか使えなさそうですが、この次に出てくる「null合体演算子」と組み合わせて使うことでめちゃくちゃ便利になります


■null合体演算子( ?? )

int hp = this.player?.hp ?? 0;

this.player?.hp の右にある 「??」が null合体演算子 です

上に処理は

int hp;
if( this,player == null ) 
{
    hp = 0;
}
else
{
    hp = this,player.hp;
}

これと全く同じことをしています

?? を区切りに左辺、右辺と分けたとすると、左辺は「this.player?.hp」右辺は「0」となりますが、
null合体演算子はこの左辺が null ではなかった場合は左辺を、nullだった場合は右辺の値を返します

null条件演算子の挙動として、もし ?. を付けた変数が null だった場合は null を返すので、これと合わせると
「もし this.player 変数が null ではなかった時には this,player から hp を取得し、null だった場合は右辺の 0 を変わりに代入する」
という真面目に書くと数行にもなるコードが1行で分かりやすく書くことができます

一応入れ子にも対応しており

var hp = this.player?.hp ?? ( DataManager.Instance?.GetDefaultHp() ?? 0 ); 

こんな感じで書くこともできますが個人的には少しわかりにくいので
?? は1行に1つまでとしておいて、それ以上になるなら if で分割したほうが見やすいと思います