Mein erster Datei-Test. Verbesserungsvorschläge?



  • Keine Exception fangen, sondern lieber was in der Richtung FileNotFoundException. 🤡



  • michme schrieb:

    Hier würde ich statt der foreach-Schleife eine for-Schleife nehmen, um nicht wie oben schon geschrieben, jedesmal ein neues string Objekt zu erzeugen. Und mit dem indexer kommst du auch bequem an den Inhalt deiner List<T>

    for(int i = 0; i < lines.Count; i++)
            output.WriteLine(lines[i]);
    

    Just my 2 ct

    Prinzipiell nicht falsch, jedoch eine Kleinigkeit stört mich:

    michme schrieb:

    um nicht [...] jedesmal ein neues string Objekt zu erzeugen.

    string gehört zu den Reference-Types, eine Schleife wie

    foreach(string line in lines)
    {
      output.WriteLine(line);
    }
    

    erzeugt also keine neuen string-objekte, sondern nur Referenzen. Ob der Einsatz der for-Schleife gegenüber der foreach-schleife an dieser Stelle also tatsächlich ein Vorteil ist kann ich zwar nicht genau sagen, jedoch stelle ich zumindest in Frage das die for-Schleife hier grundsätzlich die bessere Wahl sei.

    Im Punkto Leserlichkeit gewinnt imho die foreach-Schleife 😉



  • michme schrieb:

    Im StreamReader-Teil nutze statt der for-Schleife

    while (input.Peek() >= 0) // Peek überprüft ob noch etwas folgt ohne den Cursor zu versetzen, wenn EOF oder Error
                              // dann Rückgabe von -1 und Abbruch der Schleife
            {
                lines.Add(sr.ReadLine());
            }
    

    Ist für mich intuitiver als der for-Wurm, ausserdem wird in der for-Schleife mit jeder Runde ein neues string Objekt angelegt, was du ja so nicht brauchst.

    Wo wird da ein String-Objekt angelegt, das nicht auch in Deinem Code vorkommt? => nirgendwo.

    Hier würde ich statt der foreach-Schleife eine for-Schleife nehmen, um nicht wie oben schon geschrieben, jedesmal ein neues string Objekt zu erzeugen.

    Wie oben schon geschrieben, falsch.

    Und mit dem indexer kommst du auch bequem an den Inhalt deiner List<T>

    for(int i = 0; i < lines.Count; i++)
            output.WriteLine(lines[i]);
    

    Ja, und der 'foreach'-Schleife ist immer der Vorzug zu geben. Ist semantisch korrekter, lesbarer und lässt sich einfacher optimieren.

    /EDIT: In diesem Fall stimmt das mit der Optimierung zwar nicht, da der C#-Compiler auf die 'for'-Schleife gut optimiert bekommt aber prinzipiell ist hier eine unnötige Bereichsüberprüfung drin, die bei der 'foreach'-Schleife rausfällt.



  • Konrad Rudolph schrieb:

    Wie oben schon geschrieben, falsch.

    Gut, dann hab ich dieses hier entweder falsch verstanden oder missinterpretiert:
    A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification.



  • michme schrieb:

    Methods that appear to modify a String object actually return a new String object that contains the modification.

    Das stimmt so schon, aber hier wird zu keinem Zeitpunkt ein String modifiziert. Eine Zuweisung allein ist keine Modifikation. Mit Modifikation sind immer Dinge wie 'SubString', 'Replace' und 'ToUpper' etc. gemeint.



  • Für mein Verständnis:
    D. h. also das in der for-Schleife des OP bei Eintritt in die Schleife der String einmalig angelegt wird, mit jedem Umlauf "nur" neuer text zugewiesen wird und das also keine Modifikation ist?



  • michme schrieb:

    Für mein Verständnis:
    D. h. also das in der for-Schleife des OP bei Eintritt in die Schleife der String einmalig angelegt wird, mit jedem Umlauf "nur" neuer text zugewiesen wird und das also keine Modifikation ist?

    Ja. Es ist halt ein komplett neuer String. Aber der wird von der Methode 'ReadLine' und nicht von der Schleife angelegt und daher kommt man um den eh nicht drumherum (den will man ja haben!).



  • michme schrieb:

    Für mein Verständnis:
    D. h. also das in der for-Schleife des OP bei Eintritt in die Schleife der String einmalig angelegt wird, mit jedem Umlauf "nur" neuer text zugewiesen wird und das also keine Modifikation ist?

    So formuliert ist es aber falsch. Es wird nicht bei jedem Umlauf ein neuer Text zugewiesen sondern die Variable "line" hat immer nur eine Referenz auf das gerade aktuelle String-Objekt das von ReadLine erzeugt wurde.

    Immuteable bedeutet, das ein einmal erzeugtes string-objekt _nicht_ mehr geändert werden kann, also auch keine nachträgliche Zuweisung eines neuen Textes.

    Bei jeder erneuten Zuweisung (line = ReadLine) geht die aktuelle Referenz verloren und wird durch die Referenz auf das neue String-objekt ersetzt. Objekte, auf die keine Referenz mehr verweist werden von der GC dann irgendwann abgeräumt.



  • So hatte ich es bisher noch nicht betrachtet. Danke für die Erklärung.



  • Es gibt auch File.ReadAllLines() und File.WriteAllLines()...


Anmelden zum Antworten