Нужно ли освобождать объекты в последнем блоке блока try-catch? - PullRequest
4 голосов
/ 03 декабря 2010

Вопрос не требует пояснений:

Foo objfoo;
try
{
  objfoo = new Foo();
  ..........
  .........
}
catch
{

}
finally
{
  objfoo = null;
} 

Нужно ли освобождать подобные объекты?

Ответы [ 8 ]

13 голосов
/ 03 декабря 2010

Примечание: установка локального / поля на null не освобождает значение. Вместо этого он удаляет ссылку на значение, которое может или не может сделать его доступным для сбора во время следующего GC-стиля.

Чтобы ответить на вопрос, нет, это не обязательно. JIT`er рассчитает время последнего использования локального и по существу удалит локальное как один из корней GC объекта в это время. Обнуление локального выхода не ускорит этот процесс.

Раймонд Чен сделал отличную статью на эту тему

0 голосов
/ 03 декабря 2010

Как правило, нет необходимости делать это. Если ваша функция собирается завершить работу, ваш объект автоматически получит право на сборку мусора.

Однако, если у вас действительно длинная функция или она собирается выполнить некоторую блокирующую операцию после блока finally , то, установив переменную в значение null, вы сразу же получите право на сборку мусора. Это может быть хорошей идеей, если Foo управляет большим количеством данных, например.

0 голосов
/ 03 декабря 2010

Автоматическая сборка мусора означает, что вам не нужно освобождать ресурсы памяти, то есть объекты, созданные с новым.

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

0 голосов
/ 03 декабря 2010

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

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

0 голосов
/ 03 декабря 2010

Нет, это не обязательно, пусть CLR выполнит свою работу.

0 голосов
/ 03 декабря 2010

В C # обычно нет, потому что ваши объекты будут освобождены сборщиком мусора.Установка его в null позже может даже продлить срок его службы, поскольку (в зависимости от того, как компилятор оптимизирует ваш код) на него все еще ссылаются в этой точке.

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

0 голосов
/ 03 декабря 2010

Присваивание null переменной не приведет к удалению объекта, на который она указывает.

Вам не нужно беспокоиться об очистке памяти. C # сделает это автоматически, если вы используете .NET.

0 голосов
/ 03 декабря 2010

Вам не нужно, так как objFoo будет иметь право на сборку мусора (согласно вашему коду), как только вы выйдете из блока try. objfoo = null просто устанавливает указатель на null, если любой другой код имеет указатель на объект, то он не будет собирать мусор

...