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

Дон» t используйте 'string.Format' на путях, скорее используйте' Path.Combine (Environment.CurrentDirectory, «Dummy.txt») '. – Alxandr

+3

для немедленного 'Disposal' пытается исследовать, как использовать' using() {} 'структуру – MethodMan

+0

использовать блок 'using' с streamWriters: http://stackoverflow.com/questions/212198/what-is-the-c- sharp-using-block-and-why-should-i-use-it – 5uperdan

ответ

9

Первый потенциально использует больше операций ввода-вывода, но меньше памяти. Второй должен буферизировать все в памяти. Это может быть или не быть проблемой.

Более из проблемы в том, что вы не используете 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 довольно быстр, и вы выполняете только одну операцию записи, в отличие от первой опции, где вы постоянно создаете новый объект для каждой записи.

Смежные вопросы