对象寻址/访问问题中的C#列表

时间:2016-02-19 14:45:31

标签: c# list object reference

我有一些代码。我有一节课:

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"

试图找出我在这里做错了什么,有什么想法吗?这是某种参考问题吗?

谢谢! 乔纳森

1 个答案:

答案 0 :(得分:3)

您一直在重复使用相同的列表:

MasterList.Add(new TestClass(Name, Strings)); //<<- Strings is always the same instance

因此,您对列表所做的任何更改都将传播到所有子类,List是一个引用对象,因此当您将其传递给函数时,您不会传递数据结构,而是传递对象因此所有类都指向同一个对象。

解决这个问题的一个非常简单的方法是替换:

Strings.Clear(); // Clear array.

使用:

Strings = new List<string>();

通过这种方式,您每次都会将引用传递给新实例。