【C#】関数で2つ以上の戻り値を返せるって、なんで誰も教えてくれなかったんだ!

タプル(Tuple)とは?

UnityなどでC#のスクリプトを書いていて、関数から2つ以上の戻り値を返したいことって結構ありますよね?

私はあります。

そんなときはoutやrefを使ったり、値格納用のクラスや構造体を定義して、それを返すとかしていたわけですが、実はC#7.0(8年前!)から複数の戻り値を返す方法が実装可能となっています。

その名もタプル(Tuple)。

C#7.0での実装ですのでもちろんUnityでも使用できます。

サンプルコード

サンプルはこちら

using System.Collections.Generic;
using UnityEngine;

public class TupleSample : MonoBehaviour
{

    [SerializeField]
    private List<float> ValueList = new List<float> { 3.5f, 10f, 4.5f, 3f, 2.1f};

    // Start is called before the first frame update
    void Start()
    {
        (var idx, var value) = ReturnTwoValue();

        Debug.Log($"idx:{idx}, value:{value}");
    }

    //戻り値を2つ返すメソッドのサンプル
    public (int, float) ReturnTwoValue()
    {
        for (int i = 0; i < ValueList.Count; i++)
        {
            if (ValueList[i] > 5)
            {
                return (i, ValueList[i]);
            }
        }
        return (-1, 0);
    }

}

ReturnTwoValue()メソッドでintとfloatの値を返しています。

タプルはかなり柔軟な書き方ができるようでして、上記のように受け取り側で戻り値の名前を決めることもできますし、関数宣言時に戻り値の名前を定義することもできます。

また今回は下記のような書き方をしていますが、

(var idx, var value) = ReturnTwoValue();

少し変更して

var(idx, value) = ReturnTwoValue();

という書き方もできます。

みなさんも好みの書き方を探ってみてください。

今回は2つで使用していますが、3つや4つなど(最大7つ)必要に応じて増やすこともでき、ネストすることで理論上は無限に値を戻せるようです。(そんなことしないと思いますが・・・)

冗長なクラス、構造体の定義や、メソッドの簡素な記述に使用できると思いますので、活用できそうな箇所での使用をオススメします。

コメント

タイトルとURLをコピーしました