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);
解説
- トップレベルステートメント:
- トップレベルステートメントを使用することで、
Main
メソッドを明示的に定義する必要がありません。コードは即座に実行されます。 - これはC# 9.0以降で使用可能です。
- トップレベルステートメントを使用することで、
- PersonクラスのDeepCopyメソッド:
- 値型のメンバー(
Name
、Age
、Height
、IsEmployed
)を直接コピーしています。 string
は参照型ですが、イミュータブル(不変)なので、ディープコピーの観点からは値型のように扱えます。
- 値型のメンバー(
- コピーのテスト:
person1
オブジェクトを作成し、それをDeepCopy
メソッドを使ってperson2
としてコピーします。person2
の値を変更しても、person1
に影響がないことを確認します。
トップレベルステートメントを使うことで、C#のプログラムがよりシンプルで読みやすくなります。この方法は、特に小規模なサンプルやスクリプトに適しています。
ディスカッション
コメント一覧
まだ、コメントがありません