Menu
Coddy logo textTech

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");
}
challenge icon

Задание

Легко

Создайте метод с именем processFile, который:

  1. Принимает имя файла в качестве строкового параметра
  2. Использует оператор using с StreamReader для чтения всех строк из файла
  3. Возвращает количество строк в файле
  4. Если возникает исключение FileNotFoundException, выведите "File not found" и верните -1

Попробуйте сами

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // Напишите свой код здесь
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком