Будет ли вызываться для анонимных переменных? - PullRequest
2 голосов
/ 29 апреля 2009

Например,

int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);

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

Ответы [ 4 ]

9 голосов
/ 29 апреля 2009

Если финализатор этого класса вызывает Dispose(), да. Если нет, то нет.

(редактировать) Просто немного дополнительная информация :

Не думайте, что Dispose будет называется. Неуправляемые ресурсы, принадлежащие тип также должен быть выпущен в Завершить метод в случае, если Утилизация не называется.

Редактировать

Чтобы прояснить вышеприведенное редактирование, я видел, как многие люди (в этой теме, в SO и в других местах) утверждают, что «GC вызовет Dispose(), когда объект будет удален». Это совсем не так. Да, хороший защитный кодер, пишущий компонент, предполагает, что Dispose() не будет вызываться явно, и делает это в финализаторе. Однако хороший защитный кодер, ИСПОЛЬЗУющий компонент, должен предполагать, что финализатор НЕ вызывает Dispose(). В сборщике мусора нет автоматического вызова Dispose() . Эта функция доступна ТОЛЬКО в том случае, если финализатор вызывает Dispose().

3 голосов
/ 29 апреля 2009

Я не верю в это. Вам нужно будет написать:

 using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{
  myResult= urumsp.GetThingsDone(id);
}
1 голос
/ 29 апреля 2009

Вы можете быть уверены, что, если у него есть финализатор (деструктор), он будет вызван. Финализатор может вызвать Dispose(), но обычная реализация заключается в том, что и финализатор, и Dispose() вызывают protected Dispose(bool).

Другими словами, это зависит от реализации UnmanagedResourceUsingMemorySuckingPig, если он следует рекомендациям, тогда анонимный объект будет очищен, но не так эффективно, как с блоком using.

0 голосов
/ 29 апреля 2009

Нет. Тем не менее, сборщик мусора в конечном итоге соберет объект и заметит, что он является финализируемым (это финализуемо, верно?) И завершит его для вас. Утилизация предназначена для детерминированной очистки ресурсов.

...