添加到列表会复制类的实例吗?

时间:2013-09-08 12:07:22

标签: c# list

据我读到列表和类,如果你有一个特定类的实例列表和.Add()它们到列表中,那么应该添加引用。因此,如果您修改原始实例,然后通过列表访问它,则应获得修改后的版本。

这是我的代码的结构:

public class Config()
{
    public List<Item> listOfItems = new List<Item>();
    public Item item1 = new Item();
    public Item item2 = new Item();

    ...
    Config()
    {
        listOfItems.Add(item1);
        listOfItems.Add(item2);
        ...
    }
}

public class Item
{ 
    public string name;

    Item()
    { 
        name = "Not Set";
        ...
    }
}

在我的主代码中的某处我使用currentConfig,它是Config类的一个实例:

currentConfig.item1.name = "A";
currentConfig.item2.name = "B";

for (int i = 0; i < currentConfig.listOfItems.Count; i++)
{ 
    DoSomething(currentConfig.listOfItems[i].name);
}

但是这并没有给我item1.name和item2.name的当前值,而是“Not set”。我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我无法复制你的问题...

如果我运行以下内容,则表明项目是预期的A和B

using System.Collections.Generic;
using NUnit.Framework;

namespace ClassLibrary1
{
    [TestFixture]
    public class Stack1
    {
        [Test]
        public void TestConfigItems()
        {
            var currentConfig = new Config();

            currentConfig.item1.name = "A";
            currentConfig.item2.name = "B";

            for (int i = 0; i < currentConfig.listOfItems.Count; i++)
            {
                Assert.AreNotEqual("Not Set", currentConfig.listOfItems[i].name);
                Assert.AreEqual(i == 0 ? "A" : "B", currentConfig.listOfItems[i].name);
            }
        }

        public class Config
        {
            public List<Item> listOfItems = new List<Item>();
            public Item item1 = new Item();
            public Item item2 = new Item();

            public Config()
            {
                listOfItems.Add(item1);
                listOfItems.Add(item2);
            }
        }

        public class Item
        { 
            public string name;

            public Item()
            { 
                name = "Not Set";
            }
        }
    }
}

答案 1 :(得分:1)

我重写了你的代码而我没看到你看到了什么。一切正常,name属性正确更改。 这就是我所做的:

internal class Program
{
    private static void Main(string[] args)
    {
        var currentConfig = new Config();
        currentConfig.item1.name = "A";
        currentConfig.item2.name = "B";

        for (var i = 0; i < currentConfig.listOfItems.Count; i++)
            Console.WriteLine(currentConfig.listOfItems[i].name);
    }
}

public class Config
{
    public Item item1 = new Item();
    public Item item2 = new Item();
    public List<Item> listOfItems = new List<Item>();

    public Config()
    {
        this.listOfItems.Add(this.item1);
        this.listOfItems.Add(this.item2);
    }
}

public class Item
{
    public string name;

    public Item()
    {
        this.name = "Not Set";
    }
}