2013-08-01 66 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相當快,而且您只執行一次寫入操作,而不是第一個選項,在這裏您不斷爲每次寫入創建一個新對象。