我正在学习C#。
如果我先创建一个变量来保存列表。
List<int> mylist = new List<int>();
说我对列表做了一些工作,现在我想清除列表以将其用于其他用途。所以我执行以下操作之一:
方法1:
mylist.Clear();
方法2:
mylist = new List<int>();
目的只是清空列表中的所有值以重用列表。
使用method2是否有任何副作用。我应该赞成一种方法而不是另一种方法。
我也发现了类似的问题, Using the "clear" method vs. New Object 我将让其他读者决定最适合自己的用例的情况。所以我不会选择正确的答案。
答案 0 :(得分:2)
方法2将导致重新分配,而方法1仅清除内部数组,以便垃圾收集器可以回收内存:
来源:
// Clears the contents of List.
public void Clear() {
if (_size > 0)
{
Array.Clear(_items, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references.
_size = 0;
}
_version++;
}
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,2765070d40f47b98
我思考重新分配将比清除数组便宜。无论哪种方式,性能都可以忽略不计,除非您正在做一些真正的超密集工作。在那种情况下,您可能会考虑使用比列表还要快的数据结构。
答案 1 :(得分:1)
使用method2有副作用吗? 是。首先,分配一个新对象, 其次,第一个列表可能在下次垃圾收集器收集时收集。
我应该偏爱一种方法吗? 您应该赞成第一种方法,因为它表达了您的意图,以便更清楚地清除列表。
答案 2 :(得分:1)
使用方法2可能会导致程序内部出现意外行为,具体取决于您使用列表的方式。
如果您要执行以下操作:
List<int> myList = new List<int> { 1, 2, 3 };
someObj.listData = myList;
myList = new List<int>(); // clearing the list.
“ someObj”中的数据仍为1,2,3。
但是,如果改为使用myList.clear(),则还将清除“ someObj”中的数据。
我刚想到的另一个想法。如果您悬空了对原始列表的引用,并使用new重新分配了该变量以清除它,则GC将永远不会清理该内存。我想说,如果需要清空列表的内容,使用.clear()方法总是更安全。