Menu
Coddy logo textTech

Использование 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");
}
challenge icon

Задание

Легко

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

  1. Принимает filename в качестве параметра string
  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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C#