1. ホーム
  2. c#

[解決済み】C#でオブジェクトのコピーを作成する【重複あり

2022-04-11 03:04:54

質問

<余談
この質問には、すでにここで回答があります :
クローズド 2年前 .

以下のコードをご覧ください(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();
    }
}

以下のような出力が得られると理解しています。

objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40

最後の2行は問題ないのですが、最初の2行は、次のように出力されています。 objectAobjectB は同じメモリブロックを指しています(C#では、オブジェクトは参照型なので)。

問題は、どのようにして objectB のコピーです。 objectA で、メモリ上の別の領域を指すようにします。メンバが参照である可能性もあるので、メンバを割り当てようとするとうまくいかないかもしれないことは理解しています。では、どのようにすれば objectB とは全く別のエンティティである objectA ?

解決方法は?

ビルトインの方法はありません。MyClassに実装させることができます。 IClonable インターフェイスを使用するか (ただし、これは非推奨のようなものです)、独自のコピー/クローンメソッドを記述するだけです。どちらの場合でも、いくつかのコードを書かなければならない。

大きなオブジェクトの場合、既存のコードを再利用するために、シリアライズとデシリアライズ(MemoryStreamを使用)を検討することができます。

どのような方法であれ、quot;a copy"が正確に何を意味するかについて慎重に考えてください。どの程度の深さまでコピーする必要があるのか、例外となるIdフィールドはあるのか、など。