Что такое блок C# Using и зачем его использовать?

Какова цель использования блока в C#? Чем он отличается от локальной переменной?

9 ответов

Решение

Если тип реализует IDisposable, он автоматически удаляет его.

Дано:

public class SomeDisposableType : IDisposable
{
   ...implmentation details...
}

Это эквивалентно:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
    if (t != null) {
        ((IDisposable)t).Dispose();
    }
}

using (SomeDisposableType u = new SomeDisposableType()) {
    OperateOnType(u);
}

Второй легче читать и поддерживать.

Using звонки Dispose() после using-блок остается, даже если код выдает исключение.

Так вы обычно используете using для классов, которые требуют очистки после них, например, IO.

Итак, это с помощью блока:

using (MyClass mine = new MyClass())
{
  mine.Action();
}

будет делать так же, как:

MyClass mine = new MyClass();
try
{
  mine.Action();
}
finally
{
  if (mine != null)
    mine.Dispose();
}

С помощью using это намного короче и легче для чтения.

Из MSDN:

C# через среду выполнения.NET Framework (CLR) автоматически освобождает память, используемую для хранения объектов, которые больше не требуются. Освобождение памяти недетерминировано; память освобождается всякий раз, когда CLR решает выполнить сборку мусора. Однако обычно лучше как можно быстрее освободить ограниченные ресурсы, такие как файловые дескрипторы и сетевые подключения.

Оператор using позволяет программисту указать, когда объекты, использующие ресурсы, должны их освобождать. Объект, предоставленный оператору using, должен реализовывать интерфейс IDisposable. Этот интерфейс предоставляет метод Dispose, который должен освобождать ресурсы объекта.

Другими словами, using оператор сообщает.NET освободить объект, указанный в using заблокировать, как только он больше не нужен.

Оператор using используется для работы с объектом в C#, который реализует IDisposable интерфейс.

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

using (SqlConnection conn = new SqlConnection())
{

}

Когда мы используем вышеуказанный блок, внутренний код генерируется так:

SqlConnection conn = new SqlConnection() 
try
{

}
finally
{
    // calls the dispose method of the conn object
}

Для более подробной информации читайте: Понимание оператора using в C#.

using (B a = new B())
{
   DoSomethingWith(a);
}

эквивалентно

B a = new B();
try
{
  DoSomethingWith(a);
}
finally
{
   ((IDisposable)a).Dispose();
}

Также обратите внимание, что объект создан с помощью using только для чтения в блоке using. Обратитесь к официальной ссылке C# здесь.

Помещение кода в блок использования гарантирует, что объекты удаляются (хотя и не обязательно собираются), как только элемент управления покидает блок.

Оператор using получает один или несколько ресурсов, выполняет оператор и затем удаляет ресурс.

Это на самом деле просто синтетический сахар, который не требует от вас явного вызова Dispose для членов, которые реализуют IDisposable.

Другие вопросы по тегам