本日は 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}"); } }
シーンを再生すると一部のプロパティが変更された新しいオブジェクトが生成されていることが分かります。