如何处理对象列表;它是否释放内存

时间:2015-09-05 11:39:41

标签: c# filestream dispose memorystream

我有以下课程。

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" });

因此每个列表项都在创建一个文件流。因此,随着列表项数量的增加,流的数量增加。我该如何为这些流处理分配的内存?

2 个答案:

答案 0 :(得分:3)

所有Foo对象及其打开的流将保留在内存中,而不是垃圾收集,而FooList对象仍可从应用程序中的任何位置访问。例如,如果FooList是静态成员变量,或者是WinForm中的实例成员变量,那就是这种情况。

另一方面,如果FooList是方法中的局部变量,一旦该方法存在,就不再可以访问FooList,并且列表和Foo对象迟早会被垃圾收集。我非常确定您的开放流也会被垃圾收集。它们将通过终结器自动关闭。

在大多数情况下,使用显式Dispose方法是可选的。通常,Dispose用于确定性地释放共享资源,例如文件流,开放网络端口等。需要Dispose的类通常也会从终结器中调用Dispose,以确保在开发人员/程序没有的情况下在垃圾收集时进行清理在较早的时候这样做。但是,在Foo类中打开文件流不会阻止它们被垃圾收集。

另外,请听CodeCaster和M.kazem,如果您不立即使用它们,请不要立即打开流。这只是消耗资源和不必要地锁定文件。

答案 1 :(得分:2)

可能Foo应该实施IDisposable。然后,您可以迭代FooList,并在不再需要时为每个项目调用Dispose