2013-08-01 14 views
7

Który z nich działa lepiej lub jest bardziej poprawny? Czy lepiej jest utworzyć obiekt z klasy StreamWriter i używać go często w metodzie, a następnie wyrzucić go? lub czy lepiej jest użyć obiektu z StringBuilder, a następnie utworzyć obiekt z StreamWriter i natychmiast go zutylizować?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

Don” t używaj 'string.Format' na ścieżkach, raczej użyj' Path.Combine (Environment.CurrentDirectory, "Dummy.txt") '. – Alxandr

+3

do natychmiastowego "Disposal" spróbuj dowiedzieć się, jak używać 'using() {}' structure – MethodMan

+0

użyj bloku 'using' ze streamWriters: http://stackoverflow.com/questions/212198/what-is-the-c- ostry-używając-blok-i-dlaczego-powinieneś go użyć – 5uperdan

Odpowiedz

9

Pierwsza potencjalnie wykorzystuje więcej operacji we/wy, ale mniej pamięci. Drugi musi buforować wszystko w pamięci. To może, ale nie musi być problem.

Co więcej problemu jest to, że nie używasz oświadczenie using lub try/finally i że używasz string.Format.

Proponuję:

// 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(...); 
    } 
} 

Dodatkowo, jeśli to co piszesz jest naturalnie wyrażone jako kwerendy LINQ (lub jakiegokolwiek innego IEnumerable<string>) można po prostu użyć File.WriteAllLines:

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

To naprawdę zależy od kontekstu aplikacji. Na przykład, jeśli masz inne programy słuchające tego, co wychodzi z tego strumienia, i mogą poradzić sobie z danymi tokena na raz, to oczywiście lepiej jest wybrać pierwsze podejście.

To powiedziawszy, jeśli piszesz rzeczy do pliku tekstowego do przechowywania, prawdopodobnie będzie warto wybrać drugą opcję. Myślę, że druga opcja prawdopodobnie przebiegałaby dość szybko, ponieważ StringBuilder jest dość szybka, a wykonujesz tylko jedną operację zapisu, w przeciwieństwie do pierwszej opcji, w której ciągle tworzysz nowy obiekt dla każdego zapisu.