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ówReadLine(): odczytuje po jednej linii naraz, zwracanull, 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");
}
Wyzwanie
ŁatwyUtwórz metodę o nazwie processFile, która:
- Przyjmuje nazwę pliku jako parametr typu string
- Używa instrukcji
usingzStreamReader, aby odczytać wszystkie wiersze z pliku - Zwraca liczbę wierszy w pliku
- 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
}
}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
1Tablice wielowymiarowe
Podstawy tablic 2DDeklarowanie i inicjalizacja tablic 2DDostęp do elementów tablic 2DZagnieżdżone pętle z tablicami 2DTablice postrzępionePodstawowe operacje na macierzachPodsumowanie — tablice wielowymiarowe4Techniki sterowania przepływem
Wczesne zwrotyKlauzule ochronneInstrukcje skoku (goto)Break i continueSpłaszczanie zagnieżdżonych warunków7Zaawansowane operatory logiczne
Ewaluacja z krótkim spięciemWarunkowe operatory logicznePriorytet operatorówPowtórzenie — zaawansowane operatory2Zaawansowane podejmowanie decyzji
Wiele warunkówZłożona logika Boole’aPorównanie if i switchZagnieżdżone instrukcje switchPodsumowanie — zaawansowane decyzje5Obsługa wyjątków
Podstawy try-catchTypy wyjątkówWiele bloków catchPraca z plikamiBlok finallyusing a try-finallyWłasne wyjątkiPowtórzenie — obsługa błędów3Udoskonalenia pętli
Wydajność pętliIterowanie po złożonych strukturachKażdy typ pętliRefaktoryzacja pętliPodsumowanie — zoptymalizowane pętle6Obsługa wartości null
Podstawy referencji nullTypy wartości dopuszczające nullWzorce sprawdzania nullProgramowanie defensywnePodsumowanie — bezpieczeństwo nullPoćwicz samodzielnie: Kompilator C# online