Для полноты есть другой способ достижения аналогичного эффекта RAII без использования using
и IDisposable
. В C # using
обычно яснее ( см. Также здесь , чтобы узнать больше), но в других языках (например, Java) или даже в C #, если using
не подходит по какой-то причине, это полезно знать.
Это идиома, называемая «Execute Around», и идея заключается в том, что вы вызываете метод, который выполняет предварительные и последующие действия (например, блокирует / разблокирует ваши потоки, или устанавливает и фиксирует / закрывает ваше соединение с БД и т. Д.), И вы передайте в этот метод делегат, который будет выполнять операции, которые вы хотите выполнить между ними.
например:.
funkyObj.InOut( delegate{ System.Console.WriteLine( "middle bit" ); } );
В зависимости от того, что делает метод InOut, вывод может выглядеть примерно так:
first bit
middle bit
last bit
Как я уже сказал, этот ответ только для полноты, предыдущие предложения using
с IDisposable
, а также ключевое слово lock
будут лучше в 99% случаев.
Обидно, что, хотя .Net пошел дальше, чем многие другие современные ОО-языки в этом отношении (я смотрю на вас, Java), он все же возлагает ответственность за RAII на работу над клиентским кодом (т.е. код, который использует using
), тогда как в C ++ деструктор всегда будет запускаться в конце области.