File öffnen
-
Ich versuche derzeit einen kleinen XML Parser zu schreiben der eine xml Datei einliest und diese dann in einen Baum wandelt.
Wie ich das File einlese weiß ich grundsätzlich schon, nur bin ich auf der Suche auf etwas gestoßen wo mich die Unterschiede interesieren würden.
FileStream fs = new FileStream (path, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader sr = new StreamReader (fs, Encoding.UTF8); // readfile sr.Close (); fs.Close ();
und die andere Version wäre
FileStream fs = new FileStream (path, FileMode.Open, FileAccess.Read, FileShare.Read); using (StreamReader sr = new StreamReader (fs, Encoding.UTF8)) { // readfile } fs.Close ();
Macht es einen Unterschied was man verwendet? Gibt es bei den 2 Versionen Vor- und Nachteile (mit using scheint man sich das close sparen zu können?)? Hat vielleicht wer nen Link für mich wo ich es nachlesen kann?
-
MSDN is your friend
http://msdn.microsoft.com/de-de/library/zhdeatwt(VS.80).aspx
btw, der Befehl um eine XML Datei in einen XML-Baum zu verwandeln lautet:
XmlDocument doc = new XmlDocument(); doc.Load("name.xml");
-
Danke.
Das using entspricht also:
StreamReader sr = new StreamReader (fs, Encoding.UTF8); try { // do something sr.Close (); } finally { sr.Close (); }
Da sieht die using variante schöner aus
Wobei das jetzt eventuell uninteresant ist. Ich schau mir das XMLDocument mal genauer an.
-
using entspricht:
StreamReader sr = new StreamReader (fs, Encoding.UTF8); try { // do something } finally { sr.Close (); }
Der finally-Block wird immer ausgeführt, egal ob eine Exception geworfen wurde oder nicht.
-
@vice: MERKEN!! Sobald eine Klasse das IDisposable Interface implementiert, bist du immer gut bedient, wenn du ein Objekt dieser Klasse mithilfe des using-Idioms erstellst.
-
Falsch, using entspricht:
[cs]
StreamReader sr = new StreamReader (fs, Encoding.UTF8);
try
{
// do something}
finally
{
sr.Dispose();
}
[/cs]Und kann damit grundsätzlich auf alle Klassen angewendet werden die IDisposeable implementieren.
-
@ loks: indirekt hast du Recht. Nur wird bei StreamReader.Close() intern ein Dispose() aufgerufen. ist also egal, ob man hier .Close oder .Dispose nimmt
-
... und zusätzlich muß noch angemerkt werden dass Dispose nicht aufgerufen wird wenn dass Objekt null ist.
-
Fassen wir also zusammen:
IDisposable disposable = ... try { // do something } finally { if(disposable != null) disposable.Dispose(); }