将列表分配给另一个列表

时间:2015-03-26 20:09:10

标签: c#

我有以下代码,我不明白为什么我的主要方法列表能够更改或受其他列表影响?

 class Program
    {
        static void Main(string[] args)
        {
            List<string> t = new List<string>();
            t.Add("a");
            t.Add("b");
            t.Add("c");


            B b = new B(t);
            b.Add();
            Console.WriteLine(t.Count.ToString()); //why Output 4


        }
    }

    class B
    {
        public List<string> mylist2 { get; set; }
        public B(List<string> lsarg)
        {
            mylist2 = new List<string>(); //new allocate new location?
            mylist2 = lsarg;
        }
        public void Add()
        {
            mylist2.Add("hi");
        }
    }

在B类的构造函数中,我已经将新位置作为mylist2分配给新字段。

2 个答案:

答案 0 :(得分:6)

你遇到的问题是

mylist2 = lsarg;

此时,mylist2和lsarg是相同的列表,另一个将看到对一个的修改。如果你的意图是让mylist2拥有lsarg的所有值,但不是它的副本,那么你可以做类似的事情

mylist2 = new List<string>(lsarg); //new collection allocate, but copy old collection objects

如果您想向自己证明列表是相同的,请注意您的代码在没有行的情况下将完全相同

mylist2 = new List<string>();

答案 1 :(得分:1)

为mylist2创建新实例后,再次为其分配lsarg的相同引用。

 public B(List<string> lsarg)
        {
            mylist2 = new List<string>(); //new allocate new location?
            mylist2 = lsarg; // assigns the same reference as lsarg
        }

相反,您必须添加每个项目的副本。像下面这样的东西

public B(List<string> lsarg)
        {
            mylist2 = new List<string>(); 
            lsarg.ForEach(l=> mylist2.Add(l));
        }