我有以下代码,我不明白为什么我的主要方法列表能够更改或受其他列表影响?
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分配给新字段。
答案 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));
}