Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#清除列表与将新列表分配给现有变量_C#_List - Fatal编程技术网

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

c#清除列表与将新列表分配给现有变量,c#,list,C#,List,我在学C 如果我首先创建一个变量来保存列表 List<int> mylist = new List<int>(); 方法2: mylist = new List<int>(); mylist=newlist(); 其目的只是清空列表中的所有值以重用列表 使用方法2是否有副作用。我应该选择一种方法来替代另一种方法吗 我还发现了一个类似的问题, 我将让其他读者决定什么最适合他们自己的用例。所以我不会选择正确的答案 使用方法2是否有副作用? 对首先,分配一个

我在学C

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

List<int> mylist = new List<int>();
方法2:

mylist = new List<int>();
mylist=newlist();
其目的只是清空列表中的所有值以重用列表

使用方法2是否有副作用。我应该选择一种方法来替代另一种方法吗


我还发现了一个类似的问题, 我将让其他读者决定什么最适合他们自己的用例。所以我不会选择正确的答案

使用方法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++;
}


我认为重新分配将比清除阵列花费更少。无论哪种方式,性能都可能可以忽略不计,除非您正在做一些真正的超强度工作。在这种情况下,你可能会考虑使用比列表快的数据结构。

< P>使用方法2可能会导致程序中的意外行为,取决于你如何使用列表。 如果您要执行以下操作:

List<int> myList = new List<int> { 1, 2, 3 };

someObj.listData = myList;

myList = new List<int>(); // clearing the list.
List myList=新列表{1,2,3};
someObj.listData=myList;
myList=新列表();//清理名单。
“someObj”中的数据仍然是1,2,3

但是,如果改为使用myList.clear(),则“someObj”中的数据也将被清除


我刚才还有一个想法。如果您有对原始列表的悬空引用,并使用new重新分配变量以清除它,那么GC将永远不会清除该内存。我想说,如果需要清空列表的内容,那么使用.clear()方法总是更安全。

如果需要
list mylist=new list(),则您正在创建一个可供使用的新列表。无需清除它,它就可以使用了,只需通过包含引用的变量(
mylist
)访问它即可。如果重新分配列表(
mylist=new list();
),则旧列表不再被代码引用(如果没有其他引用该列表,则可以进行垃圾收集),然后创建新列表。您的
mylist
变量现在包含对该新列表的引用,并且可以以相同的方式使用。清除将有助于减少不必要的分配和不必要的GC收集,但会留下更多已分配的内存。。。因此,问题主要基于观点:速度与内存使用。唯一的其他真正因素是该列表中是否有其他共享引用。如果清除它,这些引用将继续使用共享列表。通过对其进行换行,这部分代码将放弃旧列表并开始使用新列表,以便在该点之后所做的更改不会反映在其他共享引用中。虽然方法1只是清除内部数组,以便垃圾收集器可以回收内存,但非真第一个方法不会导致任何GC工作编辑:。。。对于List-itsef-当然,如果List将存储原语以外的其他对象,那么它将存储其他对象-但是对于
List
来说,将不会有GC工作和关于
数组的内容。清除
RtlSecureZeroMemory(*u items,size*sizeof(T))
在windows平台上调用(对于原语)。。。当“重新分配”为alloc+创建新列表实例时,alloc+创建列表类的所有字段。。。net中的alloc不是简单的调用。。。您必须为GC等创建指针(再次为列表)
List<int> myList = new List<int> { 1, 2, 3 };

someObj.listData = myList;

myList = new List<int>(); // clearing the list.