c# - 需要删除对象 : implement Dispose or create objects in a function?

标签 c# garbage-collection idisposable

我有一些读取文件的对象,将数据保存在数组中并进行一些操作。序列是创建对象A,对对象A进行操作。创建对象B,对对象B进行操作...... 每个对象读取的数据可能在 10 MB 左右。所以最好的选择是在对每个对象进行操作后删除每个对象。假设我希望我的程序在内存中分配大约 10 MB,而不是 10MB * 1000 个对象 = 1GB

对象是这样的:

class MyClass
{  
    List<string[]> data;

    public MyClass(string datafile)
    {
        using (CsvReader csv = new CsvReader(new StreamReader(datafile), true))
        {
            data = csv.ToList<string[]>();
        }
    }

    public List<string> Operate()
    {
    ...
    }

}

我的问题是:我应该实现处置吗?并做类似的事情:

List<string> results = new List<results>();

using (MyClass m = new MyClass("fileM.txt"))
            {
                results.AddRange(m.Operate());
            }

using (MyClass d = new MyClass("fileD.txt"))
            {
                results.AddRange(d.Operate());
            }

...

我读到在使用非托管资源(套接字、流等)时建议实现 Disposable,但在我的类里面我只有大数据数组。

另一种方法是为每个对象创建函数(我想 GC 会自动删除在函数中创建的对象):

List<string> results = new List<results>();
results.AddRange(myFunction("fileM.txt"));
results.AddRange(myFunction("fileD.txt"));


public List<string> myFunction(string file)
{
MyClass c = new MyClass(file);
return results.AddRange(c.Operate());
}

最佳答案

IDisposable etc 在这里对你没有帮助,因为它不会导致收集任何东西。在这种情况下,也许最好的方法是使用 来减少分配——本质上成为您自己的内存管理器。例如,如果您的 List<string>很大,您可以通过重新使用列表来避免很多数组 - 显然在清除它们之后。如果您调用 .Clear() ,后备数组不会重置 - 它只是设置一个逻辑标记以将其视为空。在您的具体情况下,您的很多对象将是个人 string ;这比较棘手,但至少它们很小,应该可以在零代收集。

关于c# - 需要删除对象 : implement Dispose or create objects in a function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15015631/

相关文章:

asp.net - 何时在 ASP.NET MVC 应用程序生命周期中处置静态资源

C# 在没有 Excel 的情况下将 .xls 转换为 .csv

c# - 用正则表达式解析字符串

android - 防止 Android 中的 Fragment 恢复

android - Android 中使用的确切内存模型是什么?

c# - 寻找 `protected override void Dispose(bool disposing)` 的 Stylecop 完美评论

ironpython - IronPython中的C#“using” block 等效于什么?

c# - 我怎样才能有可选择的标签?

c# - Entity Framework 中的追随者模式

garbage-collection - Smalltalk 和垃圾收集