在foreach循环中实例化fileinfo类是不是很糟糕?C#有更好的方法吗?

Jim*_*Del 0 c# foreach loops class

我的下面的代码有效,但我担心它的不良做法或可能导致内存问题.但凭借我有限的知识,这是我发现的最佳方式.可以做得更好吗?

谢谢

static void Main()
{
    // Directory of files.
    const string dir = @"C:\Test";

    // File names.
    string[] fns = Directory.GetFiles(dir);

    // Order by size.
    var sort = from fn in fns
               orderby new FileInfo(fn).Length descending
               select fn;

    // List files.
    foreach (string n in sort)
    {
        Console.Write(n);
        Console.Write(" ");
        FileInfo f = new FileInfo(n);
        long file = f.Length;
        Console.WriteLine(file);
    }

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*ica 6

我发现FileInfo你的实例化没有问题.它看起来像一个托管对象.让垃圾收集者担心它.

现在FileStream您可能使用或不使用的对象FileInfo应为closed.一份using声明将在这方面为你做繁重的工作


Jus*_*ner 6

实例化FileInfo实例不是问题.它是一个没有实现的托管对象,IDisposable这意味着垃圾收集器应该能够很好地清理所有内容.

我看到的问题是你要为每个文件创建两个实例(一个在LINQ查询中,另一个在你的循环中).为什么不修改您的查询,以便您只需要一次实例化:

var sortedFiles = fns.Select(fn => new FileInfo(fn))
                     .OrderBy(f => f.Length);

foreach(var file in sortedFiles)
{
    Console.Write(file.Name);
    Console.Write(" ");
    Console.WriteLine(file.Length);
}
Run Code Online (Sandbox Code Playgroud)