Фактическое использование наконец блока

Я спросил своему другу об этом вопросе, он сказал, что он используется для уничтожения объекта, созданного во время обработки исключений. Но в c# GC там для уничтожения таких видов неиспользуемых объектов, затем каково фактическое использование наконец блока. Скажите мне со сценарием, связанным с этим.

8
задан David Neale 24 May 2010 в 04:37
поделиться

7 ответов

Сборщик мусора очистит управляемые ресурсы (объекты, созданные вашим приложением в памяти), когда на них больше не будут ссылаться. Это не включает такие вещи, как дескрипторы файлов, сетевые ресурсы, соединения с базой данных и т. Д. Вы должны очистить их самостоятельно в блоке finally , иначе вы рискуете не очистить их (хотя большинство из них будет ясно в конце концов).

ИЛИ , чаще:

Многие классы, от которых следует избавиться неуправляемыми ресурсами, реализуют интерфейс IDisposable . Это означает, что вы можете заключить код в с помощью блока и быть уверенным, что неуправляемые ресурсы будут очищены (он вызывает метод объекта Dispose () , когда он выходит за пределы области видимости).

Хорошим примером использования блока finally является использование библиотеки взаимодействия Office. Допустим, вы открываете Microsoft Word, запускаете какой-то код, код не работает ... Word всегда требует закрытия, независимо от того, произошла ошибка или нет. Поэтому я бы поместил закрывающий код в блок finally .

11
ответ дан 3 November 2019 в 13:08
поделиться

Сборщик мусора в конечном итоге уничтожит объект, это правда. Но блок finally полезен, когда у вас есть ресурсы, не относящиеся к памяти, которые лучше всего высвободить как можно скорее. Например, если у вас есть соединение с базой данных, вы не хотите, чтобы оно оставалось открытым в течение (возможно, ненадолго) до запуска финализатора, поэтому вы помещаете его в , используя блок (который является просто синтаксический сахар для блока try ... finally ):

using(var conn = new SqlConnection(...))
{
    // use the connection
}

Это синтаксический сахар для (в основном):

var conn = new SqlConnection(...);
try
{
    // use the connection
}
finally
{
    conn.Dispose();
}

Теперь, если у вас не было finally / с использованием , тогда соединение в конечном итоге будет удалено при запуске финализатора объекта, но поскольку вы не знаете, что это произойдет, лучше обернуть использование объекта в с использованием блока , чтобы гарантировать, что соединение закрывается, как только оно больше не требуется.

5
ответ дан 3 November 2019 в 13:08
поделиться

, наконец, используется для обеспечения выполнения определенных операций независимо от того, возникает ли исключение.

Одно из применений - хотя и не очень «элегантное» - это вызов close () для ранее открытого соединения с базой данных. В общем, больше используется для всех вещей, которые GC не очищает (например, базы данных или сетевые соединения).

http://msdn.microsoft.com/en-en/library/zwc8s4fz (VS.80) .aspx

1
ответ дан 3 November 2019 в 13:08
поделиться

Блок finally используется, когда вы хотите, чтобы фрагмент кода выполнялся независимо от того, произошло ли исключение или нет. Например, чтобы закрыть соединение с базой данных.

1
ответ дан 3 November 2019 в 13:08
поделиться

Сборщик мусора своевременно соберет управляемые ресурсы. Для тех, кто также хранит неуправляемые ресурсы, такие как сетевые ресурсы, соединения с базой данных или дескрипторы файлов и т. Д., Они обычно поддерживают интерфейс IDisposable , и, если все сделано правильно, все равно будут освобождать ресурсы с помощью финализатора; однако с помощью Dispose () в блоке finally позволяет вам управлять , когда эти ресурсы высвобождаются.

Если у вас есть только один объект IDisposable , то более подходящим может быть блок , использующий , хотя жюри все еще отсутствует, если вам либо (а) нужно обрабатывать возникшие исключения внутри блока, или (b) несколько IDisposable объектов используются вместе (скажем, SqlConnection , SqlCommand ...)

0
ответ дан 3 November 2019 в 13:08
поделиться

Это блок, который гарантированно запускается независимо от того, возникнет ли исключение.

Обычно вы используете его, если есть какой-то ресурс, который вы хотите обеспечить должным образом. Ничего общего с объектами, созданными во время обработки исключений . Но предположим, что у вас было какое-то соединение с базой данных или дескриптором файла.

Если это управляемый объект, реализующий IDisposable , лучшим подходом обычно является с использованием ключевого слова .

15
ответ дан 3 November 2019 в 13:08
поделиться

Блок finally не только для освобождения памяти! Подумайте об этом случае: в блоке "попытка" вы - 1. Откройте соединение с БД. 2. Выполните запрос. шаг 2 завершился неудачно, за исключением. Однако в любом случае вам следует закрыть соединение с БД - правильное место для этого находится в блоке finally.

Это только пример. Есть много разных случаев, в которых может потребоваться блок finally.

0
ответ дан 3 November 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: