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

本文关键字:实例 复制 列表 添加 | 更新日期: 2023-09-27 18:30:45

据我所知,如果你有一个某个类的实例列表和.将它们添加到列表中,应添加引用。因此,如果您修改原始实例,然后通过列表访问它,您应该获得修改后的版本。

这是我的代码结构:

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 的当前值,而是"未设置"。我做错了什么?

提前感谢!

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

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

如果我运行以下内容,它表明项目是预期的 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";
            }
        }
    }
}

我重写了你的代码,我没有看到你看到的内容。一切都很好,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";
    }
}