Ответ
Оператор 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) и другими объектами, требующими детерминированного освобождения.