Я спросил своему другу об этом вопросе, он сказал, что он используется для уничтожения объекта, созданного во время обработки исключений. Но в c# GC там для уничтожения таких видов неиспользуемых объектов, затем каково фактическое использование наконец блока. Скажите мне со сценарием, связанным с этим.
Сборщик мусора очистит управляемые ресурсы (объекты, созданные вашим приложением в памяти), когда на них больше не будут ссылаться. Это не включает такие вещи, как дескрипторы файлов, сетевые ресурсы, соединения с базой данных и т. Д. Вы должны очистить их самостоятельно в блоке finally
, иначе вы рискуете не очистить их (хотя большинство из них будет ясно в конце концов).
ИЛИ , чаще:
Многие классы, от которых следует избавиться неуправляемыми ресурсами, реализуют интерфейс IDisposable
. Это означает, что вы можете заключить код в с помощью блока и быть уверенным, что неуправляемые ресурсы будут очищены (он вызывает метод объекта Dispose ()
, когда он выходит за пределы области видимости).
Хорошим примером использования блока finally
является использование библиотеки взаимодействия Office. Допустим, вы открываете Microsoft Word, запускаете какой-то код, код не работает ... Word всегда требует закрытия, независимо от того, произошла ошибка или нет. Поэтому я бы поместил закрывающий код в блок finally
.
Сборщик мусора в конечном итоге уничтожит объект, это правда. Но блок finally полезен, когда у вас есть ресурсы, не относящиеся к памяти, которые лучше всего высвободить как можно скорее. Например, если у вас есть соединение с базой данных, вы не хотите, чтобы оно оставалось открытым в течение (возможно, ненадолго) до запуска финализатора, поэтому вы помещаете его в , используя блок
(который является просто синтаксический сахар для блока try ... finally
):
using(var conn = new SqlConnection(...))
{
// use the connection
}
Это синтаксический сахар для (в основном):
var conn = new SqlConnection(...);
try
{
// use the connection
}
finally
{
conn.Dispose();
}
Теперь, если у вас не было finally
/ с использованием
, тогда соединение в конечном итоге будет удалено при запуске финализатора объекта, но поскольку вы не знаете, что это произойдет, лучше обернуть использование объекта в с использованием блока
, чтобы гарантировать, что соединение закрывается, как только оно больше не требуется.
, наконец, используется для обеспечения выполнения определенных операций независимо от того, возникает ли исключение.
Одно из применений - хотя и не очень «элегантное» - это вызов close () для ранее открытого соединения с базой данных. В общем, больше используется для всех вещей, которые GC не очищает (например, базы данных или сетевые соединения).
http://msdn.microsoft.com/en-en/library/zwc8s4fz (VS.80) .aspx
Блок finally используется, когда вы хотите, чтобы фрагмент кода выполнялся независимо от того, произошло ли исключение или нет. Например, чтобы закрыть соединение с базой данных.
Сборщик мусора своевременно соберет управляемые ресурсы. Для тех, кто также хранит неуправляемые ресурсы, такие как сетевые ресурсы, соединения с базой данных или дескрипторы файлов и т. Д., Они обычно поддерживают интерфейс IDisposable
, и, если все сделано правильно, все равно будут освобождать ресурсы с помощью финализатора; однако с помощью Dispose ()
в блоке finally
позволяет вам управлять , когда эти ресурсы высвобождаются.
Если у вас есть только один объект IDisposable
, то более подходящим может быть блок , использующий
, хотя жюри все еще отсутствует, если вам либо (а) нужно обрабатывать возникшие исключения внутри блока, или (b) несколько IDisposable
объектов используются вместе (скажем, SqlConnection
, SqlCommand
...)
Это блок, который гарантированно запускается независимо от того, возникнет ли исключение.
Обычно вы используете его, если есть какой-то ресурс, который вы хотите обеспечить должным образом. Ничего общего с объектами, созданными во время обработки исключений
. Но предположим, что у вас было какое-то соединение с базой данных или дескриптором файла.
Если это управляемый объект, реализующий IDisposable
, лучшим подходом обычно является с использованием ключевого слова
.
Блок finally не только для освобождения памяти! Подумайте об этом случае: в блоке "попытка" вы - 1. Откройте соединение с БД. 2. Выполните запрос. шаг 2 завершился неудачно, за исключением. Однако в любом случае вам следует закрыть соединение с БД - правильное место для этого находится в блоке finally.
Это только пример. Есть много разных случаев, в которых может потребоваться блок finally.