😎

[C#] null条件演算子とnull合体演算子について

2023/08/10に公開

画像をPictureBoxで表示する際に以下の処理を行っていました。

//画像bmpをpictureBoxで表示する
if(pictureBox.Image != null){
	pictureBox.Image.Dispose();
}
pictureBox.Image = bmp;

しかし上司から「null条件演算子使った方が楽だよ」と教えてもらったためnull条件演算子について調べてみました。

null条件演算子

null条件演算子(?.)を使用すると上記のようにif文を使用せず、メソッドを呼び出した際にオブジェクトがnullかどうかをチェックし、nullであればそのままnullが返り、nullでない場合はメソッドを呼びます。またメソッドだけでなくプロパティでも使えるとのことです。

最初の例を使って書くと以下になります

pictureBox.Image?.Dispose()
pictureBox.Image = bmp;

かなり省略化されました。上記の処理を行う部分が多かったため、かなりありがたいです。ただしnull条件演算子を知らない方がみると、どういった処理をしているのか分からなくなると思うので注意が必要かもしれません。

null合体演算子

調べているとnull条件演算子とは別にnull合体演算子というものがあるのを知りました。
null合体演算子(??)は、左側のオペランドがnullでない場合、その値を返し、nullの場合には右側のオペランドを返すような処理をします。

始めのコードではいい例が思い浮かばなかったので、ChatGPTに例になるコードを教えてもらいました。

string name = null; 
string displayName = name ?? "ゲスト";

if文で記述した場合は以下のようになります。

string name = null;
string displayName;

if (name != null){
    displayName = name;
}
else{
    displayName = "ゲスト";
}

両者の組み合わせ

null条件演算子とnull合体演算子を組み合わせることも可能らしいです。

Person person = null; 
string displayName = person?.Name ?? "ゲスト"; 

処理としてはpersonがnullの場合はnull条件演算子よりnullが返ってくるので右側のゲストを返します。またperson.Nameもnullであれば同様にゲストを返します。両方ともnullでなくればperson.Nameを返すといった感じです。

if文を使用した場合は以下のようになります。

Person person = null;
string displayName;

if (person != null && person.Name != null){
    displayName = person.Name;
}
else{
    displayName = "ゲスト";
}

Discussion