Using vs. 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 — это класс, используемый для чтения текста из файлов. Вы создаете его, передавая имя файла, и он открывает файл для чтения. Он реализует 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, который:
- Принимает имя файла в качестве строкового параметра
- Использует оператор
usingсStreamReaderдля чтения всех строк из файла - Возвращает количество строк в файле
- Если возникает исключение
FileNotFoundException, выведите "File not found" и верните -1
Попробуйте сами
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Напишите свой код здесь
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety