0Pricing
C# Academy · Урок

IDisposable и оператор using

Реализуйте IDisposable, используйте оператор using для детерминированного освобождения ресурсов и сравните его с ручной конструкцией try/finally. Только C# 6.

«IDisposable и оператор using» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Зачем нужны IDisposable и using

Цель: детерминированно освобождать ресурсы.

  • Реализовывать IDisposable
  • Использовать инструкцию using (C# 6)
  • Сравнивать её с try/finally
  • Делать очистку небольшой и безопасной

Реализация IDisposable

Реализуйте IDisposable.Dispose, чтобы освобождать ресурсы (файлы, сокеты, дескрипторы). Метод должен быть идемпотентным.

using System;

// Simple disposable that tracks whether it was cleaned up
public sealed class FakeConnection : IDisposable
{
  public bool IsOpen { get; private set; }

  public FakeConnection()
  {
    IsOpen = true;
    Console.WriteLine("Open");
  }

  public void Dispose()
  {
    if (IsOpen)
    {
      IsOpen = false;
      Console.WriteLine("Close");
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    FakeConnection c = new FakeConnection();
    c.Dispose(); // manual cleanup
  }
}

Шаблон try/finally

try/finally гарантирует очистку, но многословен, и о нём легко забыть. Инструкция using является сокращённой записью.

using System;

public sealed class FakeConnection : IDisposable
{
  public void Dispose() { Console.WriteLine("Dispose called"); }
  public void Send(string msg) { Console.WriteLine("Send: " + msg); }
}

public class Program
{
  public static void Main(string[] args)
  {
    // Manual try/finally
    FakeConnection a = null;
    try
    {
      a = new FakeConnection();
      a.Send("A");
      throw new Exception("boom");
    }
    finally
    {
      if (a != null) a.Dispose(); // runs even on exception
    }

    // unreachable due to thrown exception in this demo
  }
}

Демонстрация инструкции using

Инструкция using оборачивает скрытые try/finally; Dispose вызывается при завершении блока.

using System;

public sealed class FakeConnection : IDisposable
{
  public void Dispose() { Console.WriteLine("Dispose called"); }
  public void Work() { Console.WriteLine("Working"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      using (FakeConnection c = new FakeConnection())
      {
        c.Work();
        throw new InvalidOperationException("oops");
      } // Dispose runs here automatically
    }
    catch (Exception)
    {
      Console.WriteLine("Handled");
    }
  }
}

Ввод-вывод с using

Большинство типов ввода-вывода реализуют IDisposable. Используйте using, чтобы дескрипторы своевременно закрывались.

using System;
using System.IO;

public class Program
{
  public static void Main(string[] args)
  {
    // Create a small temp file then read it
    string path = "demo.txt";
    File.WriteAllText(path, "hello");

    using (StreamReader r = new StreamReader(path))
    {
      string text = r.ReadToEnd();
      Console.WriteLine(text);
    } // r.Dispose() closes the file handle
  }
}

Советы и подводные камни using

Советы:

  • Отдавайте предпочтение using ручным вызовам Dispose.
  • Делайте Dispose небольшим и безопасным (по возможности без выброса исключений).
  • Не используйте объекты после их освобождения.
  • Для нескольких ресурсов вкладывайте блоки using, чтобы управлять порядком.

Гарантия инструкции using

Быстрая проверка: что инструкция using гарантирует для объекта IDisposable?

Повторение

Повторение: реализуйте IDisposable для ресурсов и заключайте их использование в блок using, чтобы обеспечить очистку через скрытую конструкцию try/finally в C# 6.

Часто задаваемые вопросы

Урок «IDisposable и оператор using» бесплатный?

Да — полный текст урока «IDisposable и оператор using» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «IDisposable и оператор using»?

Реализуйте IDisposable, используйте оператор using для детерминированного освобождения ресурсов и сравните его с ручной конструкцией try/finally. Только C# 6. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «IDisposable и оператор using»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. try/catch/finally, создание исключения и повторный выброс
  2. Пользовательские исключения и проектирование ошибок
  3. IDisposable и оператор using
← Назад к C# Academy