2013-08-01 13 views
7

Welcher funktioniert besser oder ist richtiger? Ist es besser, ein Objekt aus der Klasse StreamWriter zu erstellen und es häufig in einer Methode zu verwenden und es schließlich zu entfernen? Oder ist es besser, ein Objekt von StringBuilder zu verwenden, dann ein Objekt von StreamWriter zu erstellen und es sofort zu entsorgen?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 verwende 'string.Format' auf Pfaden, verwende stattdessen' Path.Combine (Environment.CurrentDirectory, "Dummy.txt") '. – Alxandr

+3

zum sofortigen 'Disposal' Versuchen Sie zu erforschen, wie man die 'using() {}' Struktur verwendet – MethodMan

+0

Verwenden Sie einen' using 'Block mit streamWriters: http://stackoverflow.com/questions/212198/what-is-the-c- sharp-using-block-und-warum-sollte-ich-benutze-es – 5uperdan

Antwort

9

Die erste verwendet möglicherweise mehr IO-Operationen, aber weniger Speicher. Die zweite muss alles im Speicher puffern. Das kann oder kann kein Problem sein.

Was mehr ein Problem ist, dass Sie keine using Anweisung oder try/finally verwenden und dass Sie verwenden string.Format.

Ich würde vorschlagen:

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

Zusätzlich wenn das, was Sie schreiben natürlich als LINQ-Abfrage (oder jede andere IEnumerable<string>) ausgedrückt wird einfach File.WriteAllLines verwenden:

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

Es hängt wirklich von dem Kontext der Anwendung. Wenn Sie zum Beispiel andere Programme hören, die aus diesem Stream kommen, und sie mit den Daten jeweils ein Token umgehen können, ist es offensichtlich vorzuziehen, mit dem ersten Ansatz fortzufahren.

Das heißt, wenn Sie nur Dinge in eine Textdatei für den Speicher schreiben, wird es wahrscheinlich Wert für die zweite Option gehen. Ich denke, die zweite Option würde wahrscheinlich ziemlich schnell laufen, vorausgesetzt, dass StringBuilder ziemlich schnell ist, und Sie nur eine Schreiboperation ausführen, im Gegensatz zu der ersten Option, bei der Sie ständig ein neues Objekt für jeden Schreibvorgang erstellen.