Реализация RAII на C#

У меня есть форма InfoPath, в которой мне нужно условно отключить события OnChange.Поскольку невозможно связать обработчики событий после загрузки формы, я вынужден полагаться на глобальный счетчик, который указывает, должно ли выполняться событие OnChange. Внутри каждого события OnChange я проверяю, имеет ли значение SuppressEventsCount == 0 перед выполнением каких-либо действий. Чтобы подавить события во время выполнения той или иной функции, я просто устанавливаю SuppressEventsCount++, и -- снова при выходе из функции. Самая большая проблема с этим заключается в том, что это не безопасно для исключений. Так что у меня возникла блестящая идея обернуть счетчик SuppressEvents в класс, который реализует iDisposable

using(SuppressEvents s = new SuppressEvents()){
   // OnChange events fired here are ignored
} // OnChange events enabled again

. Это работает, но все же не так идеально, как решение на C++, которое вообще не требует использования директивы «using».

Есть ли какой-нибудь способ:

  1. Запустить деструктор или какую-либо функцию в тот момент, когда объект выходит за пределы области видимости, ИЛИ
  2. Предотвратить инициализацию объекта SuppressEvents полностью за пределами директивы «using»
8
задан Trent 2 April 2012 в 08:00
поделиться