ICollection ClearAndAddRange 共享参考?
ICollection ClearAndAddRange share reference?
我有两个 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 { ... });
有关深度克隆的更多信息,另请参阅 this post。
我有两个 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 { ... });
有关深度克隆的更多信息,另请参阅 this post。