ルルのゲーム開発備忘録

主にUnityやC#に関する情報を気まぐれに投稿していきま~す

【C#】Unityで使えるnullの判定を楽にする演算子

はじめに

C#6.0から利用可能になっている?.演算子と、C#8.0から利用可能になっている??=演算子についての紹介です。
(Unityのクラスに対して使うのは少しだけ注意が必要です、それについては次の記事で説明予定)

?.演算子

次のような単純なStudentクラスがあったとします。

public class Student
{
    public string Name{get; set;}
}




次のようなコードがあって、studentNameを格納する行でstudentがnullだったらエラーになってしまいます。

var student = (何かしらStudent型のインスタンスを返すメソッド);

var studentName = student.Name;




そこでnullチェックを追加すると思いますが、ここで?.演算子を使うことで簡潔に書けます。

// 従来の書き方の一例
var studentName = student == null ? null : student.Name;

// ?.演算子を使った書き方 処理的には上と一緒
var studentName = student?.Name;

?.演算子は、左オペランド(今回だとstudent)がnullならnullとなり、nullでなければその先のプロパティやメソッドの呼び出しが行われその結果となる。



さらに便利な点として、?.演算子は何個も連結して書くことができます。

// このような処理があった場合にdataとstudentとNameなどそれぞれに対していちいちnullチェック処理を書かなきゃいけない
var studentName = data.student.Name.Length();

// ?.演算子を使えば、どこかがnullの時点でstudentNameがnullとなる。全部nullでなければLength()まで処理される
var studentName = data?.student?.Name?.Length();




またデリゲートなどにも使える。自分はInvoke使うときは必ず?.Invokeの形で書くように気をつけてます。

callback?.Invoke();

??=演算子

次のようにstudenNameがnullの場合に"default"という文字列を設定したい場合、以下の処理は全て結果が同じになります

var studentName = student?.Name;

// 三項演算子を使った書き方
studentName = studentName == null ? "default" : studentName

// C# 2.0から使えるnull合体演算子??での書き方
studentName = studentName ?? "default";

// C# 8.0から使えるようになったnull合体割り当て演算子??=での書き方
studentName ??= "default";

最後に

個人的には、?.を頻繁に使っているイメージがあります。連結してかけるのが便利。