如果清除了原始列表,浅克隆列表中的项会发生什么情况?
本文关键字:列表 什么情况 清除 原始 浅克隆 如果 | 更新日期: 2023-09-27 18:08:51
我最初的意图是通过TCP流异步发送列表。但是在将列表直接传递给异步线程之后,我需要清除它以再次填充新数据。因此,我使用浅克隆来创建列表的副本,并将其传递给后台线程:
private List<MyDataObject> GetShallowCloneOfDataList(List<MyDataObject> dataEvents)
{
return new List<MyDataObject>(dataEvents);
}
这是我最后的代码:
List<MyDataObject> data = new List<MyDataObject>();
while(hasMoreData)
{
data.clear();
FillListFromServer(data);
List<MyDataObject> clonedList = GetShallowCloneOfDataList(data);
Task.Run(() => SendDataList(clonedList));
}
我的问题是,当我清除原始列表data
时,克隆列表中的项目是否也会受到影响?测试我的代码显示它们没有受到影响,但我不确定在处理大量数据(每秒200K)时是否仍然如此。
不,除了可能有资格进行垃圾收集之外,现有的项不受影响。
这就像将变量设置为null一样,有效地:
MyDataObject x = new MyDataObject(); // And populate
MyDataObject y = x; // Just copy the reference
x = null; // This doesn't change either y or the data in the object
另一种思考方式是,如果你有一本写满了你朋友和家人地址的地址簿,然后把它扔进火里……你将无法再找到你的朋友和家人在哪里,但这不会改变他们住的地方。
我们这样想。你在内存中有对象,你有一个列表,其中每个索引引用内存中的一个对象。
你决定创建一个新的列表,在同一个索引处引用相同的对象,也就是说List1在索引0处的引用与List2在索引0处的引用是相同的。
现在您清除了第一个列表(它甚至不知道第二个列表的存在)。你的第二张清单是完整的!项目的数量在这里没有区别。
您需要关心的唯一一件事是,如果MyDataObject
是class
而不是struct
,那么改变列表中一个项目的属性会改变另一个项目的属性。例子:
data[0].Foo = 12;
Console.WriteLine(clonedList[0].Foo); // prints 12
但是您似乎没有在显示的代码中这样做。指出这一点,以防你将来遇到它。