ルルのゲーム開発備忘録

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

【C#】演算子(operator)のオーバーロード

はじめに

C#演算子(operator)のオーバーロードについての紹介です。

演算子オーバーロードとは

自分で定義した型に対して演算を定義することができます。例えば数値(int型など)であれば+演算子を使うことで数値を足し合わせることができますが、数値以外のものに対しても独自の+演算子の処理を定義することができます。

書き方

例えば+を定義する場合は下のような感じで書きます。

public static クラス名 operator +(クラス名 arg1,クラス名 arg2) {
    // +として定義したい処理を記述
    
   return クラス名のインスタンス
}

サンプル

public class MyTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var md1 = new MyData();
        var md2 = new MyData();

        md1++;
        md1.Log();
        // "a i u e o a"

        var md = md1 + md2;
        md.Log();
        // "a i u e o a a i u e o"
    }

    class MyData
    {
        List<string> list = new List<string>(){"a", "i", "u", "e", "o"};
        
        // MyData型の++とは、MyDataのlistに"a"を追加する処理として定義 
        public static MyData operator ++ (MyData data)
        {
            data.list.Add("a");
            return data;
        }

        // MyData型の+とは、足されるものの方のlistに足すもののlistの要素を連結させるものとして定義
        public static MyData operator + (MyData data1, MyData data2)
        {
            data1.list.AddRange(data2.list);
            return data1;
        }

        public void Log()
        {
            string log = string.Empty;
            foreach(var value in list){
                log += value  + " ";
            }
            Debug.Log(log);
        }
    }
}

オーバーロードできる演算子

・算術演算子(+, -, *, /, %)
・比較演算子(<, >, <=, >=, ==, !=)
・論理演算子(&, |, ^, !)
・シフト演算子(<<, >>)
・インクリメント演算子(++, --)

最後に

あんまり変な処理を書くと戸惑うので、なるべく元々の演算子の挙動から想像できるような処理を書くように心がけるのが大事そうですね。