気になった事を自由に書いてます。
      
シャローコピー
シャローコピーをちゃんと理解するという意味で整理した内容をメモします。

シャローコピー(shallow copy)は簡易コピーと呼ばれるものでオブジェクトのコピーを行います。 フィールドが値型の場合はオブジェクトを新たに生成し値を格納します。参照型の場合はコピー元の オブジェクトと同じオブジェクトを参照します。
シャローコピー
あれっ?と思われたかもしれません。stringは参照型ですが値型のように扱われます。
この型だけ特殊なのです。

以下はシャローコピーを行ったサンプルです。値型は各々異なる値を保持してますが、
参照型は同じオブジェクトを参照しているので片方の値を変えると、もう片方も変わっていることが分かります。
なおシャローコピーの実装はMemberwiseCloneメソッドを利用するのが手っ取り早いです。
サンプル
1
2
3
4
5
6
7
8
9
10
11
12
13

private void button1_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.CopyMyData();
    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

namespace CloneSample
{
    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 CopyMyData()
        {
            MyData value = (MyData)this.Clone();
            return value;
        }

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

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

シャローコピー

      






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