C# 将列表分配给另一个列表
我有下面的代码,我不明白为什么我在主方法上的列表能够更改或受另一个列表的影响C# 将列表分配给另一个列表,c#,C#,我有下面的代码,我不明白为什么我在主方法上的列表能够更改或受另一个列表的影响 class Program { static void Main(string[] args) { List<string> t = new List<string>(); t.Add("a"); t.Add("b"); t.Add("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");
}
}
类程序
{
静态void Main(字符串[]参数)
{
列表t=新列表();
t、 添加(“a”);
t、 添加(“b”);
t、 添加(“c”);
B=新的B(t);
b、 添加();
Console.WriteLine(t.Count.ToString());//为什么输出4
}
}
B类
{
公共列表mylist2{get;set;}
公共B(列表lsarg)
{
mylist2=新建列表();//新建是否分配新位置?
mylist2=lsarg;
}
公共无效添加()
{
mylist2.添加(“hi”);
}
}
在B类的构造函数中,我已经将新位置分配给一个新字段mylist2。您遇到的问题就在这一行
mylist2 = lsarg;
此时,mylist2和lsarg是同一个列表,对其中一个的修改将被另一个看到。如果您的意图是让mylist2拥有lsarg的所有值,但不是它的副本,那么您可以执行以下操作
mylist2 = new List<string>(lsarg); //new collection allocate, but copy old collection objects
mylist2=新列表(lsarg)//新集合分配,但复制旧集合对象
如果您想向自己证明这些列表是相同的,请注意,您的代码在没有行的情况下工作相同
mylist2 = new List<string>();
mylist2=新列表();
为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(列表lsarg)
{
mylist2=新建列表();//新建是否分配新位置?
mylist2=lsarg;//指定与lsarg相同的引用
}
相反,您必须添加每个项目的副本。像下面这样的
public B(List<string> lsarg)
{
mylist2 = new List<string>();
lsarg.ForEach(l=> mylist2.Add(l));
}
public B(列表lsarg)
{
mylist2=新列表();
lsarg.ForEach(l=>mylist2.Add(l));
}
您将一个新列表分配给mylist2,然后立即用lsarg!覆盖它!?那么mylist2长大了吗?在最初的代码中,mylist2只是lsargs的别名,不会占用太多额外的内存。如果您改为创建一个新列表并保留它,那么它将占用更多内存,但当它超出范围时将被GC删除,因此它不会成为一个长期的资源命中。所以,如果我为列表添加新值,比如(t.add(“s”)),B对象中的mylist2是否会增长?我的意思是在内存中,B对象将增长?不,它只会增加t。