Я думаю, что вы читаете документацию неправильно.Сказать, что любое использование IDisposable
, не связанное с неуправляемыми ресурсами, недокументировано, все равно, что сказать, что любое использование System.Int32
, которое не считает, недокументировано.Это интерфейс и не имеет реализации, там нет функциональности, чтобы даже начать различать то, что задокументировано, а что нет.
Цель IDisposable
состоит в том, чтобы просто предоставить разработчику механизм для детерминированного управления временем жизни их объектов.Так уж сложилось, что это в основном требование для работы с неуправляемыми ресурсами.
Одним из наиболее причудливых вариантов использования IDisposable
является синтаксический сахар using
.Как уже упоминалось, блоки using
дают область действия, и я думаю, что это довольно элегантно.
Пример 1 - блоки синхронизации
StackOverflow использует мини-профилировщик , который используетusing
блоков для определения вложенных областей исполнения:
using (profiler.Step("Doing complex stuff"))
{
using (profiler.Step("Step A"))
{ // something more interesting here
Thread.Sleep(100);
}
using (profiler.Step("Step B"))
{ // and here
Thread.Sleep(250);
}
}
Альтернатива неиспользованию using
довольно ужасна, и я даже не хочу ее здесь высмеивать.
Пример 2. Одноразовое действие
В кругах .NET Domain Driven Design были различные варианты создания одноразовых шаблонов действий.У Айенде есть один , так же, как и у Уди Дахана в его реализации Domain Events , у Джимми Богарда немного другое восприятие этого , все еще в контексте событий домена.Суть шаблона в том, что вы хотите выполнить определенные действия в некотором контексте, а затем вернуть контекст обратно к тому, что был раньше после того, как вы это сделали.
Айенде приводит простой пример:
class UsuallyReadOnly {
//.. implementation
public IDisposable AllowModification
{
get
{
_allowModification = true;
return new DisposableAction(()=>{ _allowModification = false; } );
}
}
}
И UsuallyReadOnly
использование:
UsuallyReadOnly foo = new UsuallyReadOnly();
using(foo.AllowModification)
{
foo.Name = "Bar";
}