Будет ли метод Dispose вызываться для анонимных переменных?
-
03-07-2019 - |
Вопрос
Например,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
Не существует блока using, нет очевидного способа использования блока using, нет очевидного способа вызова Dispose().И, конечно же, UnmanagedResourceUsingMemorySuckingPig реализует IDisposable.
Решение
Если финализатор этого класса вызывает Dispose()
, да.Если нет, то нет.
(редактировать) Лишь некоторые Дополнительная информация:
Не предполагайте, что распоряжение будет вызвано.Ресурсы, принадлежащие типам, также должны быть выпущены в методе завершения, если утилизируется, что не называется.
Редактировать
Чтобы прояснить приведенное выше изменение, я видел, как многие люди (в этой теме, на SO и в других местах) утверждали, что «GC вызовет Dispose()
когда объект удаляется». Это совсем не так.Да, хороший программист, пишущий компонент, будет предполагать, что Dispose()
не будет вызываться явно и делает это в финализаторе.Однако хороший программист, ИСПОЛЬЗУЮЩИЙ компонент, должен предполагать, что финализатор НЕ вызывает Dispose()
. Автоматического вызова нет Dispose()
в сборщике мусора.Эта функциональность доступна ТОЛЬКО в том случае, если финализатор вызывает Dispose()
.
Другие советы
Я так не думаю.Вам придется написать:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
Вы можете быть уверены только в том, что если у него есть финализатор (деструктор), он будет вызван.Финализатор может вызвать Dispose()
но обычная реализация заключается в том, что и финализатор, и Dispose()
вызов protected Dispose(bool)
.
Другими словами, это зависит от реализации UnmanagedResourceUsingMemorySuckingPig
, если он будет следовать рекомендациям, анонимный объект будет очищен, но не так эффективно, как при использовании using
блокировать.
Нет.Однако сборщик мусора в конечном итоге соберет объект, заметит, что он финализируем (он финализируем, верно?), и финализирует его за вас.Dispose предназначен для детерминированной очистки ресурсов.