2016-09-13 3 views
0

Есть класс .NET, который вызывает метод, когда он получает утилизировать, иногда вместо:Объект, который вызывает метод Dispose

Я хотел бы:

using(new OnDisposed(MyCleanupMethod)) 
{ 
    ... 
} 

Перед Я получаю ругал, по трем причинам:

  • для длинных try блоков позволяет читателю увидеть, что должно быть очищено в начале
  • try имеет значение, что его ловить ошибку (что это не так)
  • Чтобы сохранить код утилизации private (если IDisposable объект возвращается из класса)

Является ли это действует практика? Если это так, это .NET-класс, который делает это?

+1

Ничего, чтобы остановить вас писать его самостоятельно, но я должен сказать, что «примерка наконец» является стандартный, гораздо более ясный для разработчиков C# и подходит для вашего прецедента просто отлично. – Baldrick

+0

Вы могли бы сделать это сами. Включите параметр конструктора, который является функцией в вашем объекте, которая реализует IDisosable. Вызовите функцию в OnDispose – Jason

+0

Я не говорю, что согласен с вашим вторым моментом: 'try/finally' - это абсолютно общая конструкция, я сомневаюсь, что любой опытный разработчик предположит, что вы обязательно должны что-то ловить. Но я бы счел ваш синтаксис приемлемым, если он используется последовательно. – Groo

ответ

3

Вы можете добавить конструктор, который принимает меры:

public class OnDisposed : IDisposable 
{ 
    private readonly Action _disposeAction; 
    public OnDisposed(Action disposeAction) 
    { 
     _disposeAction = disposeAction; 
    } 

    public void Dispose() 
    { 
     // ... 
     if(_disposeAction != null) 
      _disposeAction(); 
    } 
} 

Например:

using (new OnDisposed(() => Console.WriteLine("Dispose Called"))) 
{ 
    Console.WriteLine("In using..."); 
}