需要删除对象:实现在函数中处理或创建对象?

Alb*_*rto 7 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()
    {
    ...
    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我应该实施处置吗?做一些像:

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

...
Run Code Online (Sandbox Code Playgroud)

我知道当你使用unmmanaged资源(套接字,流,...)时,建议实现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());
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

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