C#清除列表与将新列表分配给现有变量

时间:2019-01-10 19:20:25

标签: c# list

我正在学习C#。

如果我先创建一个变量来保存列表。

List<int> mylist = new List<int>();

说我对列表做了一些工作,现在我想清除列表以将其用于其他用途。所以我执行以下操作之一:

方法1:

mylist.Clear();

方法2:

mylist = new List<int>();

目的只是清空列表中的所有值以重用列表。

使用method2是否有任何副作用。我应该赞成一种方法而不是另一种方法。


我也发现了类似的问题, Using the "clear" method vs. New Object 我将让其他读者决定最适合自己的用例的情况。所以我不会选择正确的答案。

3 个答案:

答案 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()方法总是更安全。