Close() ?



  • Hallo zusammen, mich interessiert folgendes:

    StreamReader sr;
    try
    {
    sr = new StreamReader(<Dateiname>);
    }
    catch
    {
    //Fehlerbehandlung ...
    sr.Close();
    };

    Muss da sr.Close()kommen oder nicht ? Wenn new ... scheitert, dann müsste man
    StreamReader nicht noch schliessen.



  • Hat sich erledigt, Close() führt zu einer Fehlermeldung, wahrscheinlich keine Frage fürs Forum, Sorry ...



  • So macht der Code wirklich keinen Sinn, da dann eine NullReferenceException geworfen wird.
    Wenn noch weiterer Code im try-Block steht, dann sollte man es (wenn schon) so schreiben:

    if (sr != null)
        sr.Close();
    

    Besser ist aber gleich die using-Anweisung zu verwenden:

    using (var sr = new StreamReader("<Dateiname>"))
    {
      // ...
    }
    

    So wird im Falle einer Exception auf jeden Fall Dispose() aufgerufen (Close ruft intern auch nur Dispose() auf).



  • Danke Th69 !



  • Ich nochmals, die using-Anweisung, geht bei mir nicht, weil Öffnen und Schliessen in verschiedenen Methoden aufgerufen wird. Kann man zur Laufzeit oder zur Entwurfszeit feststellen, ob irgendwelche Streams noch geöffnet sind ? Ich verwende ein: StreamReader[] sarr = new StreamReader[20]; es ist Teil eines lexikalischen Analysators, der mehrere #include "Dateiname" Anweisungen verarbeitet.



  • Nein, direkt nicht. Du kannst aber Close() (bzw. Dispose()) aufrufen (auch wenn der Stream vorher noch nicht geöffnet/gelesen wurde).

    Ansonsten s.a. How to check if a StreamReader is still open?



  • private void button1_Click(object sender, EventArgs e)
    {
    StreamReader sr = null;
    try
    {
    sr = new StreamReader("C:\\Projekte\\Test\\Datei5");
    // Datei existiert nicht !
    }
    catch
    {
    sr.Close(); // NullReferenzExeption ...
    };

    }

    Vielleicht weil das Öffnen gescheitert hat.



  • lesen!!

    Th69 schrieb:

    So macht der Code wirklich keinen Sinn, da dann eine NullReferenceException geworfen wird.
    Wenn noch weiterer Code im try-Block steht, dann sollte man es (wenn schon) so schreiben:

    if (sr != null)
        sr.Close();
    


  • StreamReader sr = null;
    sr.Close(); // Fehler !

    Hier wurde sr nicht geöffnet, trotzdem bei sr.Close() der Fehler !!!
    sr.Close() geht nicht bei sr == null.



  • WTF?

    Natürlich muß ein StreamReader-Objekt angelegt worden sein, um darauf zuzugreifen (das hatte ich ja schon in meiner ersten Antwort geschrieben)!
    Ich schrieb ja auch Stream (und nicht StreamReader) und meinte damit den enthaltenen (engl. underlying) BaseStream.



  • Ok, das war ein Missverständis, Sorry ....


Log in to reply