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

How to Dispose a list of objects;Does it Free the Memory

我有以下 class.

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 应该实施 IDisposable。然后,您可以迭代 FooList 并在不再需要每个项目时调用 Dispose

所有 Foo 对象及其打开的流都将保留在内存中并且不会被垃圾回收,而 FooList 对象仍然可以从您的应用程序中的任何位置访问。比如FooList是静态成员变量,或者是WinForm中的实例成员变量,就是这样。

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

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

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