Предложение использовать оператор using
является хорошим; но это не единственный выбор. Разработчики предпочитают его синтаксически «чистый» вид и простоту использования.
Главное (и то, что using
всегда гарантирует для вас) - это убедиться, что вы звоните FileStream.Close
, несмотря ни на что. Если вы нажмете исключение, этот код может быть пропущен. Поэтому, по крайней мере, поместите ваш вызов на Close
в блоке finally
.
Лично, если я пишу какую-либо ошибку, обрабатывая себя, я предпочитаю try
/ catch
/ finally
try
/ using
/ catch
. Другой сценарий, в котором я очень предпочитаю использовать finally
, - это когда я работаю с несколькими IDisposable
объектами, и я хочу избежать глубокого вложения. Рассмотрим следующий код:
try {
using (DisposableObject obj1 = GetDisposableObject()) {
// do something
using (DisposableObject obj2 = GetAnotherDisposableObject()) {
// do something else
using (DisposableObject obj3 = GetYetAnotherDisposableObject()) {
// do even more things
// this code is now quite nested
}
}
}
} catch (SomeException ex) {
// some error-handling magic
}
Теперь сравните это с этим:
DisposableObject obj1 = null;
DisposableObject obj2 = null;
DisposableObject obj3 = null;
try {
obj1 = GetDisposableObject();
// do something
obj2 = GetAnotherDisposableObject();
// do something else
obj3 = GetYetAnotherDisposableObject();
// do even more things
// this code doesn't have to be nested
} catch (SomeException ex) {
// some error-handling magic
} finally {
if (obj3 != null) obj3.Dispose();
if (obj2 != null) obj2.Dispose();
if (obj1 != null) obj1.Dispose();
}
Лично я нахожу последнее более читабельным.
Очевидно, это личное предпочтение. Приведенные выше два примера кода дают одинаковый результат.