2013-08-01 35 views
7

哪一个工作更好或更正确? 从StreamWriter类创建一个对象并在一个方法中频繁使用并最终处理它会更好吗?或者更好地使用StringBuilder中的对象,然后从StreamWriter创建一个对象并立即处理它?Streamwriter vs StringBuilder

1)

var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
for (int i = 0; i < 100; i++) 
{ 
    //Do something include calculation 
    Write.WriteLine(something); 
} 
Write.Flush(); 
Write.Dispose(); 

2)

var Str = new StringBuilder(); 
for (int i = 0; i <  100; i++) 
{ 
    //Do something include calculation 
    Str.AppendLine(something); 
} 
var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
Write.Write(Str); 
Write.Flush(); 
Write.Dispose(); 
+8

别在路径上使用'string.Format',而是使用'Path.Combine(Environment.CurrentDirectory,“Dummy.txt”)'。 – Alxandr

+3

立即'处置'尝试研究如何使用'using(){}'结构 – MethodMan

+0

使用streamWriters中的'using'模块:http://stackoverflow.com/questions/212198/what-is-the-c-使用模块和为什么我应该使用它 – 5uperdan

回答

9

第一个可能使用更多的IO操作,但内存更少。第二个需要缓冲内存中的所有内容。这可能也可能不是问题。

什么是问题的是,你不使用using陈述或try/finally,而您使用string.Format

我建议:

// Note the more conventional variable names, too... 
string file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
using (var writer = File.CreateText(file)) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteLine(...); 
    } 
} 

此外,如果你在写什么自然地表现为LINQ查询(或任何其他IEnumerable<string>),你可以只使用File.WriteAllLines

var query = ...; // Something returning an IEnumerable<string> 
var file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
File.WriteAllLines(file, query); 
3

这真的取决于你的应用程序的情况下。例如,如果您有其他程序监听来自该流的内容,并且他们可以一次处理数据令牌,那么显然最好采用第一种方法。这就是说,如果你只是写一些东西到一个文本文件进行存储,它可能是值得的第二个选项。我认为第二个选项可能运行得非常快,因为StringBuilder相当快,而且您只执行一次写入操作,而不是第一个选项,在这里您不断为每次写入创建一个新对象。