Что такое блок 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.