在使用foreach之前是否需要存储列表?

时间:2014-02-04 18:33:12

标签: c# foreach

MSDN example显示了这一点:

    // Open the file to read from. 
    string[] readText = File.ReadAllLines(path);
    foreach (string s in readText)
    {
        Console.WriteLine(s);
    }

但我在想这个:

    // Open the file to read from. 
    foreach (string s in File.ReadAllLines(path))
    {
        Console.WriteLine(s);
    }

4 个答案:

答案 0 :(得分:3)

这两个代码段之间没有区别,假设readText从未在其他任何地方使用过。

即使在第二种情况下,方法调用的结果最终也会存储在某处,即使该位置没有您可以在代码中引用的名称。

另一方面,如果你不做任何事情,只是遍历这些行,你可以使用ReadLines而不是ReadAllLines来传输文本行,而不是急切地加载整个行在处理任何行之前将文件存入内存。这样可以防止在访问第一行之前出现长时间延迟,如果在处理所有行之前最终退出循环,可以提供显着的速度提升(请记住,除了显式退出循环外,这可能由于异常而发生) ),即使你最终处理完所有的行,也会大大减少程序的内存占用。

答案 1 :(得分:2)

两个代码段是等效的。

更好的是,如果您按字符付款,则无需明确s的类型:

foreach (var s in File.ReadAllLines(path))
{
    Console.WriteLine(s);
}

答案 2 :(得分:1)

如果以后不需要列表,则无需将结果存储在列表中。 我的猜测是,当在Release模式下构建时,编译器会优化它。

但是,第一种方法有一个优点:在调试过程中,您可以使用“自动”或“本地”窗口来检查变量的内容,这可能会有所帮助。

答案 3 :(得分:0)

foreach方法的结果执行

File.ReadAllLines(path)操作。所以他们都是一样的。