Нужно ли использовать выражение «использование» в коротком методе? - PullRequest
1 голос
/ 12 октября 2011

Нужно ли использовать оператор using для немедленного удаления даже в методе?Или окончание метода вызовет автоматическое Dispose всех локальных переменных, включая графику?(Я спрашиваю об этом, потому что я видел примеры, в которых есть Dispose вызовы в конце методов, и хотел знать, действительно ли это необходимо.)

Спасибо.

Ответы [ 3 ]

10 голосов
/ 12 октября 2011

Да, вы делаете.Выход из области действия ничего не делает ;он не вызывает Dispose(), он не собирает мусор, он не вызывает финализатор.

Если тип IDisposable, то yes .Ваша задача - привести себя в порядок (предполагая, что объект на самом деле «сделан» на этом этапе).

Возможные побочные эффекты от того, что вы этого не делаете:

  • filesостаются открытыми и вызывают исключения доступа (FileStream)
  • соединения остаются открытыми и вызывают насыщение пула (DbConnection)
  • неуправляемые дескрипторы насыщаются и вызывают истощение ресурсов (любые winforms /и т.д.)
  • транзакции остаются открытыми и вызывают блокировку (TransactionScope / DbTransaction)
  • и т. д.

в основном, плохие вещи.

Кроме того, в большинстве случаев, когда вы видите Dispose() в нижней части метода, using будет предпочтительным.В есть некоторые случаи, когда это невозможно (например, поля на объекте), но суть остается: это звучит как плохие примеры.

4 голосов
/ 12 октября 2011

Вы никогда не не можете распоряжаться объектом. Но если вы хотите высвободить неуправляемые ресурсы раньше, чем когда GC обходит его (то есть когда он обрабатывает очередь fReachable), тогда yes, вам следует , поскольку область действия метода не определяет будет называться финализ одноразового объекта.

Более подробно вы можете прочитать Джеффри Рихтера Сборка мусора: автоматическое управление памятью в Microsoft .NET Framework

Как заметил Делнан, если есть жесткое ограничение на ресурсы, которые вы используете, на вас гораздо больше шансов повлиять, если вы позволите GC получить его, а не вызывать Dispose. Соединения с БД являются хорошим примером такого рода ресурсов и, безусловно, являются причиной создания счетчика производительности NumberOfReclaimedConnections .

0 голосов
/ 12 октября 2011

Да, используйте using. Это прекрасное утверждение.

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

Поэтому, пожалуйста, позвоните Dispose, как только сможете. Если вам не нужен объект, для которого определен этот метод, вызовите его.

...