Будет ли метод Dispose вызываться для анонимных переменных?

StackOverflow https://stackoverflow.com/questions/803381

  •  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 предназначен для детерминированной очистки ресурсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top