如何处置对象列表;它能释放内存吗
本文关键字:释放 内存 何处置 对象 列表 | 更新日期: 2023-09-27 18:11:31
我有以下类。
public class Foo
{
private string _DirName;
private FileStream _MyfileStream;
public FileStream MyfileStream
{
get { return _MyfileStream; }
}
public string DirName
{
get { return _DirName; }
set
{
_DirName = value;
_MyfileStream = new FileStream(value, FileMode.Create);
}
}
}
我创建了一个Foo列表,如下所示:
List<Foo> FooList = new List<Foo>();
FooList.Add(new Foo() { DirName = @"F:'sample'sample.txt" });
FooList.Add(new Foo() { DirName = @"D:'sample'file.pdf" });
因此,每个列表项都在创建一个文件流。因此流的数量随着列表项的数量的增加而增加。如何处理为这些流分配的内存?
所有Foo对象及其打开的流都将保留在内存中,而不是垃圾收集,而FooList对象仍然可以从应用程序中的任何点访问。例如,如果FooList是一个静态成员变量,或者是WinForm中的实例成员变量,则会出现这种情况。
另一方面,如果FooList是方法中的局部变量,那么一旦方法存在,FooList将不再可访问,列表和Foo对象迟早会被垃圾收集。我敢肯定你的开放流也会被垃圾收集。它们将通过终结器自动关闭。
在大多数情况下,使用显式Dispose方法是可选的。通常,Dispose用于确定地释放共享资源,如文件流、打开的网络端口等。如果开发人员/程序以前没有这样做,则需要Dispose的类通常也会从终结器调用Dispose,以保证在垃圾收集时进行清理。但是,在Foo类中打开文件流并不能防止它们被垃圾收集。
此外,听CodeCaster和M.kazem的话,如果你不立即使用它们,就不要立即打开流。这只是不必要地消耗资源和锁定文件。
可能Foo
应该实现IDisposable
。然后,您可以迭代FooList
,并在不再需要时对每个项目调用Dispose
。