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

标签 c# list garbage-collection

<分区>

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

例如:

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

myList = new List<element>();

编辑:即使有简单的方法解决这个问题,我也想知道它的哲学方面。如果有解决办法,让某些东西被垃圾收集是不是很糟糕?允许垃圾收集与删除元素并重用相同内存的成本是多少?

最佳答案

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

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

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

  1. 一般来说,如果不重用对象,代码会更简洁、更容易理解。垃圾回收成本低,混淆代码成本高。
  2. 考虑一下如果转储列表内容的代码在另一个函数中会发生什么,因为它很可能是这样。一旦您将该列表从其本地上下文中传递出去,就可能存在对同一列表的非本地引用。其他代码可能正在修改列表,或者可能(错误地)假设您没有修改它。

关于c# - 让 C# 垃圾收集列表而不是重用它是一种不好的形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11548331/

相关文章:

c# - 代码为 "finish off a graph"

c# - 如何设计包含大量 IF 或 Switch 语句的方法

list - 我应该如何删除列表中的非数字使用序言

c# 析构函数(和终结器?)在程序结束时自动调用 - 我应该对此做些什么吗?

c# - 如何对 ObservableCollection 进行排序?

c# - 如何从包含 c#.net 中的 2 个元素的列表中单独获取第二个元素?

C# 删除重复条目(但不保留第一个条目和第二个条目)

Python pdb——如何更改 "l"命令列出的默认行?

java - 垃圾收集器是否保证在内存不足错误之前运行?

C# - 处理递归对象