【问题标题】:How to Dispose a list of objects;Does it Free the Memory [duplicate]如何处理对象列表;它是否释放内存 [重复]
【发布时间】:2015-09-05 11:39:41
【问题描述】:

我有以下课程。

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

所以每个列表项都在创建一个文件流。因此,流的数量随着列表项数量的增加而增加。我怎样才能为这些流分配分配的内存?

【问题讨论】:

  • “为这些流分配的内存”是什么意思?你知道什么是垃圾回收吗?如果您此时不打算读取文件,为什么要创建 FileStream?您想在哪个特定时间处理,为什么?答案显然是FooList.ForEach(f =&gt; f.MyfileStream.Dispose()),但是这里的设计是有问题的。
  • 你可以将流的路径保存为字符串。然后在需要时加载和卸载它。

标签: c# filestream dispose memorystream


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 释放流将释放共享资源(在本例中为文件句柄),但不会释放内存。内存只会被垃圾回收释放。目前尚不清楚 OP 真正想要什么:释放内存(标题)还是仅通过流释放内存(资源)?
    • @Christoph 我不清楚他到底问了什么。让我们来看看。那就是说你的答案好多了。 +1
    • 刚刚更正了我的评论并取消了-1,因为您的答案当然也没有错。对不起;-)
    猜你喜欢
    • 2015-05-31
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多