MRが楽しい

MRやVRについて学習したことを書き残す

record型のwith式を使って一部のプロパティを変更した新しいオブジェクトを作成する

本日は C# の小ネタ枠です。
C# 9.0 以降で利用可能な with 式を使ってインスタンスから一部のプロパティを変更した新しいインスタンスを生成してみます。

with式

with 式は C# 9.0 以降で利用可能です。
C# 9.0 では対象のオペランドが record 型である必要があります。
C# 10.0 では対象が構造体型または匿名型でも利用できます。
learn.microsoft.com

Unity 2021.2 以降は C# 9.0 に対応しているため、このバージョンであれば Unity でも with 式が利用可能です。
unity.com

サンプルシーン

以下のサンプルスクリプトを作成して動作を確認してみました。
・WithTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WithTest : MonoBehaviour
{
    private record Monster
    {
        public string Name;
        public string Breeds;

        public Monster(string name, string breeds)
        {
            Name = name;
            Breeds = breeds;
        }
    }

    void Start()
    {
        var holomon = new Monster("HoloMon", "HolographicMonster");
        var bell = holomon with { Name = "Bell" };

        Debug.Log($"holomon = {holomon}");
        Debug.Log($"bell = {bell}");
    }
}

シーンを再生すると一部のプロパティが変更された新しいオブジェクトが生成されていることが分かります。

Unity2020環境

前述の通り、Unity 2020 環境は C# 8.0 のため、with 式はエラーが発生して利用できません。

Tips

Unity 2020 環境で同様のことをする場合、以下のようにスクリプトを作成します。
・WithTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WithTest : MonoBehaviour
{
    private class Monster
    {
        public string Name;
        public string Breeds;

        public Monster(string name, string breeds)
        {
            Name = name;
            Breeds = breeds;
        }

        public Monster WithName(string name)
        {
            return new Monster(name, this.Breeds);
        }

        public Monster WithBreeds(string breeds)
        {
            return new Monster(this.Name, breeds);
        }
    }

    void Start()
    {
        var holomon = new Monster("HoloMon", "HolographicMonster");
        var bell = holomon.WithName("Bell");

        Debug.Log($"holomon = {holomon.Name}, {holomon.Breeds}");
        Debug.Log($"bell = {bell.Name}, {bell.Breeds}");
    }
}

シーンを再生すると一部のプロパティが変更された新しいオブジェクトが生成されていることが分かります。