C#列表被视为指针而不是对象的容器

C#列表被视为指针而不是对象的容器,c#,.net,list,C#,.net,List,我想我已经弄明白这里发生了什么,但我想得到一些确认。(代码在问题的底部) 我有一个列表对象,需要对其进行复制 我尝试的方法是创建另一个相同类型的新列表,然后使用“=”操作数,我还使用AddRange方法进行了测试,得到了相同的结果 无论我如何操作列表的副本,它都会将操作应用于原始列表 我相信这是因为C#将列表用作引用/指针结构,而不是对象/值。这是正确的吗 temp1.AddRange(list1); temp2.AddRange(list2); foreach(

我想我已经弄明白这里发生了什么,但我想得到一些确认。(代码在问题的底部)

我有一个列表对象,需要对其进行复制

我尝试的方法是创建另一个相同类型的新列表,然后使用“=”操作数,我还使用AddRange方法进行了测试,得到了相同的结果

无论我如何操作列表的副本,它都会将操作应用于原始列表

我相信这是因为C#将列表用作引用/指针结构,而不是对象/值。这是正确的吗

 temp1.AddRange(list1);
 temp2.AddRange(list2);


            foreach(record item in temp1)
            {
                foreach (KeyValuePair<string, string> itemB in temp2.First().data)
                {
                    item.data.Add(itemB.Key, null);
                    ERRORDATA = "item data state:" + item.ToString() + "\r\nitemB key:[" + itemB.Key + "] " + itemB.Value;
                }
            }

temp1.First().data.Add("DOOBY", "doo");
temp1.AddRange(列表1);
temp2.AddRange(列表2);
foreach(在temp1中记录项目)
{
foreach(temp2.First().data中的KeyValuePair项B)
{
item.data.Add(itemB.Key,null);
ERRORDATA=“项数据状态:”+item.ToString()+”\r\nitemB键:[“+itemB.key+”]“+itemB.Value;
}
}
temp1.First().data.Add(“DOOBY”、“doo”);
执行此操作后,list1插入了dooby、doo键/值对,而它本应只对temp1对象插入dooby、doo键/值对


为所有答案干杯。

在我看来,您将“列表”temp1的更改与每个列表所包含对象的更改混淆了。每个列表持有的对象只是对对象的引用,因此对一个列表中的对象所做的更改将反映在其他列表中。但是,如果使用temp1.Add(o),o将不会添加到temp2。

是,
List
是一种引用类型,而不是值类型。使用
x.GetType().IsValueType
确定对象是否具有值类型语义。这方面的主要例外是
System.String
,它是一种引用类型,具有值类型语义。当您发布代码时,将其设置为“复制并粘贴可执行文件”,这将非常有用。现在它就像一个神秘的填字游戏线索。为确认干杯,我想它是那样的,但不是100%确定。对不起,我应该指定我使用两个不同的列表,每个列表都有一个副本。对temp1中对象的更改会影响列表1中的对象。所以是的,你和《谜》很合拍。