Приведи пример использования созданного класса в операторе using в C#

«Приведи пример использования созданного класса в операторе using в C#» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор using гарантирует корректное освобождение неуправляемых ресурсов путем автоматического вызова метода Dispose(). Класс должен реализовывать интерфейс IDisposable.

Пример:

// Класс, представляющий ресурс (например, файловый поток или сетевое соединение)
public class DatabaseConnection : IDisposable
{
    private SqlConnection _connection;

    public DatabaseConnection(string connectionString)
    {
        _connection = new SqlConnection(connectionString);
        _connection.Open();
        Console.WriteLine("Connection opened.");
    }

    public void ExecuteQuery(string query)
    {
        // Выполнение запроса...
        Console.WriteLine("Executing query: " + query);
    }

    public void Dispose()
    {
        if (_connection != null)
        {
            _connection.Close();
            _connection.Dispose();
            _connection = null;
            Console.WriteLine("Connection closed and disposed.");
        }
        // Подавляем финализацию, так как ресурсы уже освобождены
        GC.SuppressFinalize(this);
    }
}

// Использование в коде
static void Main()
{
    string connString = "Server=...";
    // Dispose() будет вызван автоматически при выходе из блока using,
    // даже в случае возникновения исключения.
    using (var db = new DatabaseConnection(connString))
    {
        db.ExecuteQuery("SELECT * FROM Users");
    } // Здесь вызывается db.Dispose()
    // После этого блока ресурс гарантированно освобожден.
}

Ключевые моменты:

  • Гарантия очистки: using обеспечивает вызов Dispose() при любом сценарии выхода из блока.
  • Синтаксический сахар: Компилятор разворачивает using в блок try-finally.
  • Применение: Используется для работы с файлами (FileStream), сетевыми подключениями, графическими контекстами (Graphics) и другими объектами, требующими детерминированного освобождения.