让C#垃圾收集列表而不是重用它是不好的形式?

Rob*_*man 2 c# garbage-collection list

我有一个稳定增长的元素列表,直到我将该列表中的所有数据转储到一个文件中.然后,我想再次将该列表重用于同一目的.简单地将其分配给新列表而不是从列表中删除所有元素是不好的做法吗?似乎垃圾收集应该处理旧列表,这样我就不必担心删除元素了.

例如:

var myList = new List<element>();
myList.Add(someElement);
myList.Add(anotherElement);
// dumps the elements into a file

myList = new List<element>();
Run Code Online (Sandbox Code Playgroud)

编辑:即使有很简单的方法,我也想知道它的哲学方面.如果周围有办法让垃圾收集起来是不是很糟糕?允许垃圾收集与删除元素和重用相同内存的成本是多少?

Eri*_*ang 6

myList.Clear() 比编码更容易编码 myList = new List<element>();

msdn:List.Clear方法

列表中的每个元素本身都是不同的对象,无论是清除列表,还是重新创建新列表,或者一次删除一个项目,都需要进行垃圾回收.如果您只是清除列表并重复使用它就不需要进行垃圾回收是列表本身.除非您的列表很大,包含数十万个项目,否则很难以某种方式衡量性能差异.幸运的是,垃圾收集器经过高度优化,在开发人员需要考虑它正在做什么的情况下很少发生.

(正如其他人所指出的那样,涉及到各种因素,例如......你将在新列表中添加多少元素?vs旧​​列表中有多少元素?...但重点是:垃圾在收集列表元素时,列表本身的集合是不相关的.)


pho*_*oog 6

这取决于列表中有多少元素.如果支持列表的阵列足够大,可以在大对象堆上,那么最好清除列表并重新使用它.这将减少大内存分配的数量,并将有助于减少大对象堆碎片的问题.(参见http://msdn.microsoft.com/en-us/magazine/cc534993.aspxhttp://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large -object堆/更多的信息请参见http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx为.NET 4.5的改进)

如果列表很小,您可能最好只创建一个新列表,或者您可能会获得更好的性能调用Clear().如有疑问,请测量性能.

编辑:为了回应您在编辑中提出的哲学问题,创建新列表有两个原因:

  1. 通常,如果不重用对象,代码更清晰,更容易推理.垃圾收集的成本很低,代码混乱的代价很高.
  2. 考虑如果转储列表内容的代码在另一个函数中会发生什么,因为它很可能是.一旦将该列表从其本地上下文中传出,就可能存在对同一列表的非本地引用.其他代码可能正在修改列表,或者可能假设(错误地)您没有修改它.