2

プロジェクトで静的変数を使用すると問題が発生します (強制的に静的変数を使用する)

public static List<int> a = new List<int>();
public static List<List<int>> list = new List<List<int>>();
public Form1()
{
    for (int i = 0; i < 5;i++ )
        a.Add(i);
    list.Add(a);
    Console.WriteLine(list[0].Count); // **count = 5**
    a.RemoveAt(0);
    list.Add(a);
    Console.WriteLine(list[0].Count); // **count = 4** 
    Console.WriteLine(list[1].Count); // count = 4
}

を使うa.RemoveAt(0)list[0]変化します。なぜこれを行うのですか?どうすれば修正できますか?

4

4 に答える 4

2

基礎から理解する必要があります。Listsオブジェクトは参照を通じて機能します。オブジェクトaをに追加したときは、へlistの参照を追加したことを意味します。これまでに変更した内容は、同じ参照を参照しているため、反映されます。alistalist[0]

これを達成するために、次のようなことができます。

        var masterList = new List<List<int>>();

        var l1 = new List<int>{1, 2, 3, 4, 5}; // Reference created for l1
        var l2 = new List<int>(); // Reference created for l2

        masterList.Add(l1); // l1 reference added to masterList
        masterList.Add(l2); // l2 reference added to masterList

        l2.AddRange(l1); // This will copy values from l1 reference to l2 reference and will not touch the references

        l2.RemoveAt(0); // First value removed from reference l2 (And therefore it should not affect reference l1)

        MessageBox.Show(masterList[0].Count.ToString() + " and " + masterList[1].Count.ToString());

ここで何が起こっているのかを理解するのに役立つはずです。また、質問の見出しが示すように、静的変数とは何の関係もないことも覚えておく必要があります。

それが役に立てば幸い。

于 2013-07-12T12:52:00.467 に答える