Если тип реализует 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);
}
второе легче считать и поддержать.
Из MSDN:
C#, через общеязыковую среду выполнения (CLR) Платформы.NET, автоматически освобождает память, используемую, чтобы хранить объекты, которые больше не требуются. Выпуск памяти недетерминирован; память освобождена каждый раз, когда CLR решает выполнить сборку "мусора". Однако обычно лучше высвободить ограниченные средства, такие как дескрипторы файлов и сетевые соединения как можно быстрее.
оператор использования позволяет программисту определять, когда объекты, которые используют ресурсы, должны выпустить их. Объект, предоставленный оператору использования, должен реализовать интерфейс IDisposable. Этот интерфейс предоставляет Расположить метод, который должен высвободить средства объекта.
, Другими словами, using
оператор говорит.NET выпускать объект, определенный в using
блок, как только это больше не необходимо.
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
путь короче и легче читать.
Размещение кода в блоке использования гарантирует, что объекты расположены (хотя не обязательно собранный), как только управление оставляет блок.
using (B a = new B())
{
DoSomethingWith(a);
}
эквивалентно
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
Это - действительно просто немного синтетического сахара, который не требует, чтобы Вы к вызову explicity Расположили на участниках ту реализацию IDisposable.
Оператор using получает один или несколько ресурсов, выполняет оператор, а затем удаляет ресурс.