ゆーとぴあ。ブログ

技術の備忘録や、日記などを投稿します

【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と出力されます。(エラーにはならない)

Invoke

指定したdelegateを実行するメソッドです。
本来、Invoke (delegateメソッド) といった書き方をしますが、
delegateメソッド.Invoke() という書き方で実行することも可能です。


この2つを踏まえて先ほどの処理をこのように書き換えることができます。

private void Hoge (System.Action action = null)
{
    action?.Invoke();
}

これでかなりコードをスッキリさせることができました。