Использование Using вместо Try-Finally
Часть раздела Логика и управление потоком путешествия по C# на Coddy. Урок 28 из 66.
И операторы using, и блоки try-finally помогают управлять ресурсами, которые необходимо правильно освобождать. Оператор using предоставляет более чистый и лаконичный способ гарантировать правильную очистку объектов IDisposable.
Примечание: using заменяет шаблон try-finally для освобождения ресурсов. Он не заменяет try-catch. Ты всё ещё можешь обернуть блок using в try-catch, чтобы обработать исключения.
Сначала рассмотрим подход с try-finally:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Инструкция using упрощает этот код:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
Инструкция using автоматически вызывает Dispose() при выходе из блока, даже если возникает исключение.
Что такое StreamReader?StreamReader — это class, используемый для чтения текста из файлов. Его создают, передавая filename, после чего он открывает file для чтения. Он реализует IDisposable, поэтому после использования его необходимо правильно закрыть — именно это за вас делает using.
Распространённые методы StreamReader:
ReadToEnd(): считывает весь файл как одну строкуReadLine(): считывает по одной строке за раз, возвращаетnull, когда достигнут конец файла
Чтобы посчитать количество строк в файле, можно использовать цикл с ReadLine():
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
Вы также можете объединить using с try-catch, чтобы обрабатывать исключения, например отсутствие файла:
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");
}
Задание
ЛегкоСоздай метод с именем processFile, который:
- Принимает filename в качестве параметра string
- Использует оператор
usingс помощьюStreamReader, чтобы прочитать все строки из файла - Возвращает количество строк в файле
- Если возникает
FileNotFoundException, выведи "File not found" и верни -1
Попробуйте сами
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Напишите свой код здесь
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Многомерные массивы
Основы 2D-массивовОбъявление и инициализация 2D-массивовДоступ к элементам 2D-массиваВложенные циклы с 2D-массивамиЗубчатые массивыОсновные операции с матрицамиПовторение — многомерные массивы4Методы управления потоком выполнения
Досрочный выходЗащитные условияОператоры перехода (goto)Break и ContinueУпрощение вложенных условных конструкций7Логические операторы: продвинутый уровень
Вычисление с коротким замыканиемУсловные логические операторыПриоритет операторовПовторение — продвинутые операторы2Продвинутое принятие решений
Множественные условияСложная логика BooleanСравнение If и SwitchВложенные конструкции SwitchПовторение — продвинутые решения5Обработка исключений
Основы Try-CatchТипы исключенийНесколько блоков CatchРабота с файламиБлок FinallyИспользование Using вместо Try-FinallyПользовательские исключенияПовторение — обработка ошибок3Улучшение циклов
Производительность цикловИтерация по сложным структурамКаждый тип циклаРефакторинг цикловПовторение — оптимизированные циклы6Обработка null
Основы ссылок на nullТипы значений, допускающие nullШаблоны проверки на nullЗащитное программированиеПовторение — безопасность при работе с nullПотренируйтесь самостоятельно: Онлайн-компилятор C#