Заявление using
using(var disposableObject = new object_that_implements_IDisposable()) { ... }
синтаксический сахар для кода, подобного следующему:
var disposableObject = new object_that_implements_IDisposable()
try
{
...
}
finally
{
if(disposableObject != null)
{
((IDisposable)your_object).Dispose();
}
}
Это только применимо для классов, реализующих IDisposable. Это полезно для очистки кода, где у вас есть объекты, которые, например, занимают системные ресурсы (дескрипторы файлов, соединения с базой данных, сокеты и т. Д.), Которые необходимо очистить после того, как вы закончите, чтобы освободить ресурс для остальной части система.
Теоретически вы можете пропустить вызов .Dispose()
, но тогда вам придется подождать, пока сборщик мусора освободит сохраненные ресурсы. Сборщик мусора прекрасно знает, когда освобождать объекты, чтобы восстановить использование ими памяти, но он понятия не имеет, что ему нужно освободить объекты, чтобы они отказались от других системных ресурсов. Таким образом, эти критические ресурсы не могут быть предоставлены до тех пор, пока сборщик мусора не решит, что ему нужна память, используемая владельцем. Таким образом, вы определенно захотите утилизировать свои объекты, когда закончите с ними (если они одноразовые)!
Что касается того, почему вы бы использовали using
вместо _6 _ / _ 7_, это чисто предпочтение программиста. Я предпочитаю using
, потому что их можно каскадировать:
using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
...
}
Для этого с _10 _ / _ 11_ вам понадобится еще несколько строк кода.
using
также имеет дополнительные преимущества. Например, в то время как вызов x.Dispose
напрямую может выдать NullReferenceException
, если x
имеет значение null, using(x)
не будет.
Смотрите также:
25.01.2010