我有一些代码。我有一节课:
public class TestClass
{
private string String1 = "";
private List<string> Strings = new List<string>();
public TestClass(string String1, List<string> Strings)
{
this.String1 = String1;
this.Strings = Strings;
} // end constructor.
// Associated get/set methods.
} // end class.
然后我(在另一个类中,使用了一些代码):
public TestMethod()
{
List<string> Strings = new List<string>();
List<TestClass> MasterList = new List<TestClass>();
int Counter = 0;
string Name = " ... " // <- updated every time.
while(Condition1)
{
if(Condition2)
{
Strings.Add(Counter.ToString());
}
else
{
MasterList.Add(new TestClass(Name, Strings));
Name = // ... <- name updated here.
Strings.Clear(); // Clear array.
} // end if.
} // end while.
} // end method.
第一次,MasterList
的第一个元素是&#34; Name1&#34;并且该列表包含&#34; 1,2,3和#34;。下一次,MasterList
包含&#34; Name2&#34;和&#34; 4,5,6和#34;但第一个元素现在包含&#34; 4,5,6和#34;而不是&#34; 1,2,3和#34;。运行一段时间后,&#34; Name1&#34;,&#34; Name2&#34;每次都会更新,但每个元素列表都是完全相同的内容,例如,输出应该是什么:
"Name1" -> "1, 2, 3"
"Name2" -> "4, 5, 6"
"Name3" -> "7, 8, 9"
实际发生的事情:
"Name1" -> "7, 8, 9"
"Name2" -> "7, 8, 9"
"Name3" -> "7, 8, 9"
试图找出我在这里做错了什么,有什么想法吗?这是某种参考问题吗?
谢谢! 乔纳森
答案 0 :(得分:3)
您一直在重复使用相同的列表:
MasterList.Add(new TestClass(Name, Strings)); //<<- Strings is always the same instance
因此,您对列表所做的任何更改都将传播到所有子类,List是一个引用对象,因此当您将其传递给函数时,您不会传递数据结构,而是传递对象因此所有类都指向同一个对象。
解决这个问题的一个非常简单的方法是替换:
Strings.Clear(); // Clear array.
使用:
Strings = new List<string>();
通过这种方式,您每次都会将引用传递给新实例。