気になった事を自由に書いてます。
      
ディープコピー
シャローコピーに続き、ディープコピーもメモします。

ディープコピー(deep copy)は詳細コピーと呼ばれるものでオブジェクトのコピーを行います。
フィールドが値型の場合は新しくフィールドのオブジェクトを生成し値を格納します。
参照型の場合も同様に新しくオブジェクトを生成し値を格納します。
つまり参照型であってもコピーしたオブジェクトは異なります。
ディープコピー

ディープコピーの実装はすこし手間がかかります。MemberwiseCloneメソッドを呼び出した後に
参照型のオブジェクトを一つずつ自前でコピーしていきます。
注意が必要なのはクラス内で参照型のメンバ変数が増えた場合です。
その場合、このコピーするメソッドも変更しないといけません。
忘れると思わぬところで不具合が発生する可能性が。。

サンプル
1
2
3
4
5
6
7
8
9
10
11
12
13

private void button2_Click(object sender, EventArgs e)
{
    MyData data = new MyData();
    data.StringList.Add("123456789");
    data.StringList.Add("aaaaaaaaa");
    data.Text = "data";
    data.Val = 100;

    MyData data2 = data.DeepCopyMyData();
    data2.StringList[0] = "123";
    data2.Text = "data2";
    data2.Val = 50;
}

MyData.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

public class MyData : ICloneable
{
    private List<string> _stringList = new List<string>();
    private string _text = string.Empty;
    private int _val = 0;

    public int Val
    {
        get { return _val; }
        set { _val = value; }
    }

    public string Text
    {
        get { return _text; }
        set { _text = value; }
    }

    public List<String> StringList
    {
        get { return _stringList; }
        set { _stringList = value; }
    }
    public MyData DeepCopyMyData()
    {
        MyData value = (MyData)this.Clone();
        // 参照型は新しくオブジェクトを生成する
        value.StringList = new List<string>(this.StringList);

        return value;
    }
    public MyData CopyMyData()
    {
        MyData value = (MyData)this.Clone();
        return value;
    }

    public Object Clone()
    {
        return this.MemberwiseClone();
    }
}

サンプルの変数は以下のようになっています。
ディープコピー

ディープコピー

      






Copyright (C) 2011 - 2017 猫の気ままなC#日記