2013-08-01 5 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

ドン」 'Path.Combine(Environment.CurrentDirectory、" Dummy.txt ")'を使用してパス上で 'string.Format'を使用しないでください。 – Alxandr

+3

すぐに 'Disposal'のために' using(){} '構造を使う方法を研究しよう – MethodMan

+0

streamWritersで 'using'ブロックを使う:http://stackoverflow.com/questions/212198/what-is-the-c-シャープブロックを使用する理由と私はそれを使用する必要がありますそれは – 5uperdan

答えて

9

最初に、より多くのIO操作を使用しますが、メモリは少なくなります。 2番目はすべてをメモリにバッファリングする必要があります。それは問題かもしれません。問題のより何

あなたは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

それは本当にあなたのアプリケーションのコンテキストに依存します。たとえば、ストリームから出てくるものを聴いている他のプログラムがあり、一度にトークンを扱うことができれば、最初のアプローチに進むことが明らかです。

つまり、ストレージのためにテキストファイルに書き込むだけであれば、おそらく2番目のオプションに行く価値があります。 StringBuilderは非常に速く、最初のオプションではなく、書き込みごとに新しいオブジェクトを連続して作成するのではなく、1回の書き込み操作しか実行していないため、2番目のオプションがかなり早く実行されると思います。