Possible Duplicate:. 【.Net(C#)でオブジェクトのディープコピーを行う方法】(https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically)
以下のコードをご覧ください(C#の本からの抜粋)。
public class MyClass
{
public int val;
}
public struct myStruct
{
public int val;
}
public class Program
{
private static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
I understands it produces the output below:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
出力の最後の2行は問題ありませんが、最初の2行は、objectA
とobjectB
が同じメモリブロックを指していることを示しています(C#では、オブジェクトは参照型なので)。
問題は、objectB
をobjectA
のコピーにして、メモリ内の異なる領域を指すようにするにはどうしたらいいかということです。メンバも参照である可能性があるので、そのメンバを割り当てようとしてもうまくいかないことは理解しています。では、objectB
をobjectA
とはまったく別の実体にするにはどうしたらよいのでしょうか?
ありがとうございます。
することができました。
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
とすると、次のことができます。
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
現在のSystem.Objectの浅いコピーを作成します。
ビルトインの方法はありません。MyClass に IClonable
インターフェースを実装させるか (ただし、これは非推奨です)、独自の Copy/Clone メソッドを作成することができます。どちらにしても、いくつかのコードを書かなければなりません。
大きなオブジェクトの場合は、既存のコードを再利用するために、シリアライズとデシリアライズ(MemoryStreamを通して)を考慮することができます。
どのような方法であれ、「コピー」の意味をよく考えてください。どのくらいの深さまでコピーすべきか、除外すべきIdフィールドはあるのか、などです。
この件については、すでに質問がありますので、そちらをご覧になってはいかがでしょうか。
https://stackoverflow.com/questions/78536/cloning-objects-in-c
例えば、JavaにあるようなClone()メソッドはありませんが、クラスにコピーコンストラクタを含めることはできます。これも良い方法です。
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
これは例として、新しいオブジェクトを構築する際にメンバー 'Attr'をコピーするというものです。