Menu
Coddy logo textTech

using a try-finally

Część sekcji Logika i sterowanie przepływem ścieżki C# w Coddy. Lekcja 28 z 66.

Zarówno instrukcje using, jak i bloki try-finally pomagają zarządzać zasobami, które należy prawidłowo zwolnić. Instrukcja using zapewnia czytelniejszy i bardziej zwięzły sposób na zagwarantowanie, że obiekty IDisposable zostaną prawidłowo posprzątane.

Uwaga: using zastępuje wzorzec try-finally służący do zwalniania zasobów. Nie zastępuje try-catch. Nadal możesz umieścić blok using wewnątrz try-catch, aby obsługiwać wyjątki.

Najpierw przyjrzyjmy się podejściu try-finally:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

Instrukcja using upraszcza ten kod:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Instrukcja using automatycznie wywołuje Dispose(), gdy kończy się blok, nawet jeśli wystąpi wyjątek.

Czym jest StreamReader?
StreamReader to klasa służąca do odczytywania tekstu z plików. Tworzysz jej instancję, przekazując nazwę pliku, a ona otwiera go do odczytu. Implementuje interfejs IDisposable, więc po użyciu należy ją prawidłowo zamknąć — właśnie tym zajmuje się za Ciebie using.

Typowe metody klasy StreamReader:

  • ReadToEnd(): odczytuje cały plik jako jeden ciąg znaków
  • ReadLine(): odczytuje po jednej linii naraz, zwraca null, gdy osiągnięto koniec pliku

Aby policzyć wiersze w pliku, możesz użyć pętli ReadLine():

using (StreamReader reader = new StreamReader("file.txt"))
{
    int lineCount = 0;
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
    Console.WriteLine(lineCount);
}

Możesz również połączyć using z try-catch, aby obsługiwać wyjątki, takie jak brak pliku:

try
{
    using (StreamReader reader = new StreamReader("file.txt"))
    {
        int lineCount = 0;
        while (reader.ReadLine() != null)
        {
            lineCount++;
        }
        Console.WriteLine(lineCount);
    }
}
catch (FileNotFoundException)
{
    Console.WriteLine("File not found");
}
challenge icon

Wyzwanie

Łatwy

Utwórz metodę o nazwie processFile, która:

  1. Przyjmuje nazwę pliku jako parametr typu string
  2. Używa instrukcji using z StreamReader, aby odczytać wszystkie wiersze z pliku
  3. Zwraca liczbę wierszy w pliku
  4. Jeśli wystąpi FileNotFoundException, wypisuje "File not found" i zwraca -1

Spróbuj swoich sił

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // Wpisz tutaj swój kod
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i sterowanie przepływem

Poćwicz samodzielnie: Kompilator C# online