Что такое блок С# Using и почему я должен его использовать?

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

Ответ 1

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

Дано:

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

Они эквивалентны:

SomeDisposableType t = new SomeDisposableType();
try {
    OperateOnType(t);
}
finally {
   t.Dispose();
}

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

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

Ответ 2

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 более короткое и удобное для чтения.

Ответ 3

Из MSDN:

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

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

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

Ответ 4

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

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

using (SqlConnection conn = new SqlConnection())
{

}

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

SqlConnection conn = new SqlConnection() 
try
{

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

Подробнее читайте: Понимание инструкции 'using' в С#.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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