收集ClearAndAddRange共享引用
本文关键字:引用 共享 ClearAndAddRange 收集 | 更新日期: 2023-09-27 18:16:44
我有两个ICollection
列表fullList
和displayList
。
private void method()
{
if(condition != null) {
displayList.Clear();
if(fullList.Count() > 0)
{
displayList.ClearAndAddRange(
fullList.Where(x=>x.conditionID == condition.conditionID));
}
}
}
我目前面临的问题是,每当我在displayList
中更新一些值时,fullList
也会更新。这是预期行为吗?
这确实是预期的行为。考虑以下两个列表:
var list1 = new[] { myObj1, myObj2 };
var list2 = list1;
list2[0].myProp = 3;
其中myObj1
和myObj2
是MyClass
的实例。
由于list1
和list2
共享对所包含对象的相同引用,对这些项的任何修改也将反映在另一个列表中。当你想避免这种行为时,你必须提供一个深度拷贝,这将创建一个全新的对象实例:
var list2 = list1.Select(x => new MyClass { ... });
有关深度克隆的更多信息,请参阅这篇文章