我有以下课程。
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" });
因此每个列表项都在创建一个文件流。因此,随着列表项数量的增加,流的数量增加。我该如何为这些流处理分配的内存?
答案 0 :(得分:3)
所有Foo对象及其打开的流将保留在内存中,而不是垃圾收集,而FooList对象仍可从应用程序中的任何位置访问。例如,如果FooList是静态成员变量,或者是WinForm中的实例成员变量,那就是这种情况。
另一方面,如果FooList是方法中的局部变量,一旦该方法存在,就不再可以访问FooList,并且列表和Foo对象迟早会被垃圾收集。我非常确定您的开放流也会被垃圾收集。它们将通过终结器自动关闭。
在大多数情况下,使用显式Dispose方法是可选的。通常,Dispose用于确定性地释放共享资源,例如文件流,开放网络端口等。需要Dispose的类通常也会从终结器中调用Dispose,以确保在开发人员/程序没有的情况下在垃圾收集时进行清理在较早的时候这样做。但是,在Foo类中打开文件流不会阻止它们被垃圾收集。
另外,请听CodeCaster和M.kazem,如果您不立即使用它们,请不要立即打开流。这只是消耗资源和不必要地锁定文件。
答案 1 :(得分:2)
可能Foo
应该实施IDisposable
。然后,您可以迭代FooList
,并在不再需要时为每个项目调用Dispose
。