如何处置对象列表;它能释放内存吗

本文关键字:释放 内存 何处置 对象 列表 | 更新日期: 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