Это для защиты от Thread.Abort
прерывания процесса. Документация для этого метода гласит:
Неисполненные блоки finally выполняются перед прерыванием потока.
Это потому, что для успешного восстановления после ошибки ваш код должен быть очищен после себя. Поскольку в C # нет деструкторов в стиле C ++, блоки finally
и using
являются единственным надежным способом обеспечения надежного выполнения такой очистки. Помните, что using
блок превращается в это компилятором:
try {
...
}
finally {
if(obj != null)
((IDisposable)obj).Dispose();
}
В .NET 1.x был шанс, что блок finally
будет прерван. Это поведение было изменено в .NET 2.0.
Более того, пустые блоки try
никогда не оптимизируются компилятором.