Вызов Располагает () по сравнению с тем, когда объект выходит концы объема/метода

Отбросьте его в задании крона, которое работает каждую ночь (день?), когда Вы спите.

14
задан ivcubr 11 January 2019 в 15:39
поделиться

6 ответов

Нет, объекты не удаляются автоматически, когда они выходят из области видимости.

Их даже не гарантирует удаление, если / когда они собираются сборщиком мусора, хотя многие Объекты IDisposable реализуют «резервный» финализатор, чтобы гарантировать их окончательное удаление.

Вы несете ответственность за удаление любых объектов IDisposable , желательно заключив их в с помощью блока .

26
ответ дан 1 December 2019 в 07:52
поделиться

Вы должны использовать , используя {... } блок для обертывания ваших объектов IDisposable - метод Dispose () (который для SqlDataReader передается методу Close () ) будет вызываться при завершении использования блока . Если вы не используете с помощью , объект будет , а не , будет автоматически удален, когда он выйдет из области видимости - это будет до финализатора объекта, если он есть, чтобы избавиться ресурсов при сборке мусора

using (SqlDataReader aReader = aCommand.ExecuteReader())
{
    // ... do stuff
}   // aReader.Dispose() called here
8
ответ дан 1 December 2019 в 07:52
поделиться

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

using (SqlDataReader aReader = aCommand.ExecuteReader())
{
    // your code
}
1
ответ дан 1 December 2019 в 07:52
поделиться

Меня озадачивает утверждение: «В блоке finally вручную удаляются те объекты, которые установлены на уровне класса». Под объектами, установленными на уровне класса, вы имеете в виду поля? Вероятно, вам не следует избавляться от них в рамках обычного метода, потому что тогда время жизни полей непредсказуемо и зависит от того, какие методы вы случайно вызывали. Было бы лучше реализовать IDisposable и удалить поля в вашем методе Dispose.

0
ответ дан 1 December 2019 в 07:52
поделиться

Я согласен со всем вышеизложенным. Убедитесь, что вы вызываете Dispose () самостоятельно, и самый простой способ сделать это с помощью оператора using (вы также можете сделать это самостоятельно в finally ] блок - более подробный, но иногда необходимый). Если вы этого не сделаете, вы можете обнаружить, что в вашем приложении происходит утечка неуправляемых ресурсов, таких как дескрипторы, или даже неуправляемой памяти, особенно если где-то под всем этим используются некоторые COM-компоненты или выполняются вызовы Win32 API. Это, очевидно, может привести к проблемам с производительностью и стабильностью, а также к чрезмерному использованию ресурсов.

Просто потому, что объекты, реализующие IDisposable «должны» реализовать финализатор, который вызывает их метод Dispose (bool dispose) для освобождения неуправляемых ресурсов, это не гарантирует, что это произойдет, поэтому вам определенно не следует полагаться на него. См., Например, http://msdn.microsoft.com/en-us/library/b1yfkh5e%28VS.71%29.aspx для получения дополнительной информации по этому вопросу.

Также кое-что еще. следует иметь в виду, что если у вашего типа есть одноразовые члены, ваш тип должен либо реализовывать IDisposable (если жизненный цикл этих членов не управляется другим типом, который, очевидно, может стать беспорядочным), либо, если вы используете такие элементы только в одном методе или для реализации одной конкретной функциональности, вам следует подумать о том, чтобы сделать их локальными переменными / параметрами в методах, которые их используют.

Нет гарантии, что это произойдет, поэтому рассчитывать на это точно не стоит. См., Например, http://msdn.microsoft.com/en-us/library/b1yfkh5e%28VS.71%29.aspx для получения дополнительной информации по этому вопросу.

Также кое-что еще. следует иметь в виду, что если у вашего типа есть одноразовые члены, ваш тип должен либо реализовывать IDisposable (если жизненный цикл этих членов не управляется другим типом, который, очевидно, может стать беспорядочным), либо, если вы используете такие члены только в одном методе или для реализации одной конкретной функции, вам следует подумать о том, чтобы сделать их локальными переменными / параметрами в методах, которые их используют.

Нет гарантии, что это произойдет, поэтому рассчитывать на это точно не стоит. См., Например, http://msdn.microsoft.com/en-us/library/b1yfkh5e%28VS.71%29.aspx для получения дополнительной информации по этому вопросу.

Также кое-что еще. следует иметь в виду, что если у вашего типа есть одноразовые члены, ваш тип должен либо реализовывать IDisposable (если жизненный цикл этих членов не управляется другим типом, который, очевидно, может стать беспорядочным), либо, если вы используете такие члены только в одном методе или для реализации одной конкретной функции, вам следует подумать о том, чтобы сделать их локальными переменными / параметрами в методах, которые их используют.

1
ответ дан 1 December 2019 в 07:52
поделиться
-2
ответ дан 1 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: