9

どちらがよりうまく機能するか、より正しいですか? クラスからオブジェクトを作成StreamWriterし、メソッドで頻繁に使用し、最終的に破棄する方が良いでしょうか? または、オブジェクトを使用してからオブジェクトをStringBuilder作成しStreamWriter、すぐに破棄する方が良いですか?

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();
4

2 に答える 2

10

1 つ目は、より多くの 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);
于 2013-08-01T08:13:35.337 に答える
4

アプリケーションのコンテキストに大きく依存します。たとえば、そのストリームから出てくるものをリッスンしている他のプログラムがあり、一度に 1 トークンずつデータを処理できる場合は、明らかに最初のアプローチを使用することをお勧めします。

とはいえ、保存用にテキスト ファイルに書き出すだけの場合は、おそらく 2 番目のオプションを選択する価値があります。StringBuilder書き込みごとに新しいオブジェクトを継続的に作成する最初のオプションとは対照的に、2 番目のオプションはおそらく非常に高速に実行されると思います。

于 2013-08-01T08:13:09.020 に答える