【Unity】Actionのnullチェックを省略する
C#には、delegateと呼ばれる機能があります。
ufcpp.net
簡単に言うと、関数を入れられる変数です。
C++を知っている人であれば、関数ポインタやstd::functionを思い浮かべればわかりやすいと思います。
delegateは、コールバックに使われたりラムダ式に書き換えて使われたり様々な用途があります。
Action
Unityでの開発において、System.Action型を用いた処理を書くことがよくあります。
これはActionデリゲートとも呼ばれ、返り値なく何かの処理を実行した場合に使います。
(※返り値が必要な場合はSystem.Funcを用います)
delegateをそのまま使う場合は、delegateの作成とコールバックの定義など必要な処理がありますが、Actionはそれを省略して使うことができます。
ここで、こんな処理があったとします。
private void Hoge (System.Action action = null) { if (action != null) { action(); } }
中のnullチェック必要だけども毎回書いてると面倒だし汚くなりますよね。
そこで、使うのがNull許容型とInvokeメソッドです。
Nullable型(Null許容型)
※C# 6.0以降で使用することができます
msdn.microsoft.com
(null)オブジェクトを渡してメンバを呼び出したりするとNullReferenceExceptionがスローされます。
そこで、こんな書き方をします。
Debug.Log(value?.Hoge());
本来、valueが(null)だった場合Hogeを呼び出そうとするとNullReferenceExceptionがスローされますが、
Nullableにすることによって、nullと評価されます。そのため上記の場合ログにnullと出力されます。(エラーにはならない)