C#で参照型変数を値型としてコピーする(ただしメンバーは値型のみ)

メンバーがすべて値型であれば、ディープコピーは非常にシンプルになります。値型のメンバーは直接コピーするだけでよいため、特別な処理をする必要がありません。以下に、値型のみを持つクラスのディープコピーの例を示します。

値型のみのクラスのコピーの例

using System;

public class Person
{
    public string Name { get; set; } // stringは参照型ですが、内容がイミュータブルなので値型のように扱えます
    public int Age { get; set; }
    public double Height { get; set; }
    public bool IsEmployed { get; set; }

    public Person DeepCopy()
    {
        // 値型メンバーの直接コピー
        return new Person
        {
            Name = this.Name,
            Age = this.Age,
            Height = this.Height,
            IsEmployed = this.IsEmployed
        };
    }
}
// トップレベルステートメント
Person person1 = new Person
{
    Name = "John",
    Age = 30,
    Height = 180.5,
    IsEmployed = true
};

Person person2 = person1.DeepCopy();

// テスト
Console.WriteLine("Person 1: " + person1.Name + ", " + person1.Age + ", " + person1.Height + ", " + person1.IsEmployed);
Console.WriteLine("Person 2: " + person2.Name + ", " + person2.Age + ", " + person2.Height + ", " + person2.IsEmployed);

// person2の値を変更してもperson1には影響しないことを確認
person2.Name = "Doe";
person2.Age = 40;
person2.Height = 175.3;
person2.IsEmployed = false;

Console.WriteLine("After modification:");
Console.WriteLine("Person 1: " + person1.Name + ", " + person1.Age + ", " + person1.Height + ", " + person1.IsEmployed);
Console.WriteLine("Person 2: " + person2.Name + ", " + person2.Age + ", " + person2.Height + ", " + person2.IsEmployed);

解説

  1. トップレベルステートメント:
    • トップレベルステートメントを使用することで、Mainメソッドを明示的に定義する必要がありません。コードは即座に実行されます。
    • これはC# 9.0以降で使用可能です。
  2. PersonクラスのDeepCopyメソッド:
    • 値型のメンバー(NameAgeHeightIsEmployed)を直接コピーしています。
    • stringは参照型ですが、イミュータブル(不変)なので、ディープコピーの観点からは値型のように扱えます。
  3. コピーのテスト:
    • person1オブジェクトを作成し、それをDeepCopyメソッドを使ってperson2としてコピーします。
    • person2の値を変更しても、person1に影響がないことを確認します。

トップレベルステートメントを使うことで、C#のプログラムがよりシンプルで読みやすくなります。この方法は、特に小規模なサンプルやスクリプトに適しています。

Unity

Posted by hidepon